Apache réécrit plusieurs conditions

9

J'ai un site Web qui a migré d'un ancien nom de domaine (par exemple olddomain.com) vers un nouveau nom de domaine (par exemple newdomain.com).

Pour des raisons de référencement, je dois réécrire tout le trafic du site Web vers le nouveau nom de domaine principal (par exemple, www.newdomain.com). Malheureusement, je ne sais pas comment ajouter plusieurs conditions de réécriture de type OU. Il semble qu'avec toutes les conditions, exemple de code ci-dessous, j'obtiens une condition 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>

Quelqu'un peut-il m'aider un peu? Toute aide serait grandement appréciée.

gurun8
la source

Réponses:

16

Malgré le fait que vous ayez déjà trouvé de travailler pour votre solution, je publierai toujours ceci car le vôtre est loin d'être optimal.

Solution n ° 1 : remplacez [NC]par [NC,OR]dans les 2 premières lignes RewriteCond du code d'origine. Par défaut, un RewriteCond est lié à un autre RewriteCond par logique AND. Cela demandera à Apache d'utiliser la ORlogique:

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]

Solution n ° 2 : Étant donné que vous n'avez que 4 noms de domaine au total, il sera beaucoup plus facile d'utiliser une approche opposée - redirigez à partir de N'IMPORTE QUEL domaine sauf celui-ci:

RewriteCond %{HTTP_HOST} !^www.newdomain.com [NC]
RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,L,NC]
LazyOne
la source
La solution n ° 2 est la meilleure, mais si vous l'avez www.newdomain.comet test.newdomain.comou quelque chose comme ça, il pourrait être préférable de faire la !newdomain.com$comparaison tant que l'ancien domaine ne se termine pas par "newdomain.com" comme "thisisanoldnewdomain.com". Plus précisément avec # 1, je ne trouve pas [OU] documenté nulle part. Est-ce que ça marche vraiment?
DerfK
@DerfK docs - vous devez faire défiler un peu: "'ornext | OR' (ou condition suivante) Utilisez ceci pour combiner des conditions de règle avec un OU local au lieu du AND implicite."
LazyOne
1

Je viens de trouver cette citation:

rewriteConds ne s'applique qu'à la seule rewriteRule qui les suit.

ici: http://www.webmasterworld.com/apache/3350200.htm

Voici la solution de travail pour moi:

    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
la source
1
Pour ceux qui visitent ici des années plus tard, la solution proposée par LazyOne ci-dessus (et acceptée par OP) est beaucoup plus optimisée, surtout si vous avez plus de deux ou trois conditions à ORréunir.
Doktor J