Apache reescribe múltiples condiciones

9

Tengo un sitio web que migró de un antiguo nombre de dominio (por ejemplo, olddomain.com) a un nuevo nombre de dominio (por ejemplo, newdomain.com).

Por razones de SEO, necesito reescribir todo el tráfico del sitio web al nuevo nombre de dominio principal (por ejemplo, www.nuevodominio.com). Desafortunadamente, no sé cómo agregar múltiples condiciones de reescritura de tipo OR. Parece que con todas las condiciones, el código de ejemplo a continuación, obtengo una condición AND.

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName newdomain.com
        ServerAlias www.newdomain.com
        ServerAlias olddomain.com
        ServerAlias www.olddomain.com
        DocumentRoot /var/www/newdomain.com/www/
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        RewriteEngine on
        RewriteCond %{HTTP_HOST} ^olddomain.com [NC]
        RewriteCond %{HTTP_HOST} ^www.olddomain.com [NC]
        RewriteCond %{HTTP_HOST} ^newdomain.com [NC]
        RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,NC]

        CustomLog /var/log/apache2/access.log combined
</VirtualHost>

¿Alguien puede darme un poco de ayuda? Cualquier ayuda sería muy apreciada.

gurun8
fuente

Respuestas:

16

A pesar del hecho de que ya has encontrado la solución para trabajar, todavía publicaré esto ya que el tuyo está lejos de ser óptimo.

Solución n. ° 1 : Reemplace [NC]por las [NC,OR]primeras 2 líneas RewriteCond del código original. Por defecto, un RewriteCond vinculado a otro RewriteCond por lógica AND. Esto le indicará a Apache que use la ORlógica:

RewriteCond %{HTTP_HOST} ^olddomain.com [NC,OR]
RewriteCond %{HTTP_HOST} ^www.olddomain.com [NC,OR]
RewriteCond %{HTTP_HOST} ^newdomain.com [NC]
RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,L,NC]

Solución n. ° 2 : dado que solo tiene 4 nombres de dominio en total, será mucho más fácil usar un enfoque opuesto: redirigir desde CUALQUIER dominio excepto el correcto:

RewriteCond %{HTTP_HOST} !^www.newdomain.com [NC]
RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,L,NC]
LazyOne
fuente
Solución # 2 es el mejor, aunque si que tienes www.newdomain.comy test.newdomain.com, o algo por el estilo, que puede ser mejor para que coincida contra !newdomain.com$el tiempo que el viejo dominio no terminó en "newdomain.com" como "thisisanoldnewdomain.com". Más al punto con el # 1, no puedo encontrar [OR] documentado en ninguna parte. ¿Eso realmente funciona?
DerfK
@DerfK docs : debe desplazarse un poco: "'ornext | OR' (o siguiente condición) Use esto para combinar condiciones de regla con un OR local en lugar del AND implícito".
LazyOne
1

Acabo de encontrar esta cita:

rewriteConds solo se aplica a la única rewriteRule que les sigue.

aquí: http://www.webmasterworld.com/apache/3350200.htm

Aquí está la solución de trabajo para mí:

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^olddomain.com [NC]
    RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,NC]

    RewriteCond %{HTTP_HOST} ^www.olddomain.com [NC]
    RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,NC]

    RewriteCond %{HTTP_HOST} ^newdomain.com [NC]
    RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,NC]
gurun8
fuente
1
Como una nota para cualquier persona que visite aquí años después, la solución propuesta por LazyOne arriba (y aceptada por OP) está mucho más optimizada, especialmente si tiene más de dos o tres condiciones ORjuntas.
Doktor J