Apache schreibt mehrere Bedingungen neu

9

Ich habe eine Website, die von einem alten Domainnamen (z. B. olddomain.com) auf einen neuen Domainnamen (z. B. newdomain.com) migriert wurde.

Aus SEO-Gründen muss ich den gesamten Website-Verkehr auf den primären neuen Domain-Namen (z. B. www.newdomain.com) umschreiben. Leider weiß ich nicht, wie ich mehrere Umschreibbedingungen vom Typ OR hinzufügen soll. Es scheint, dass ich mit allen Bedingungen, Beispielcode unten, eine UND-Bedingung erhalte.

<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>

Kann mir jemand ein wenig helfen? Jede Hilfe wäre sehr dankbar.

gurun8
quelle

Antworten:

16

Trotz der Tatsache, dass Sie bereits gefunden haben, dass Sie für Ihre Lösung arbeiten, werde ich dies dennoch veröffentlichen, da Ihre Lösung bei weitem nicht optimal ist.

Lösung 1 : Ersetzen [NC]von [NC,OR]in ersten 2 RewriteCond Linien des ursprünglichen Codes. Standardmäßig ist eine RewriteCond logisch mit einer anderen RewriteCond verknüpft AND. Dadurch wird Apache angewiesen, ORLogik zu verwenden :

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]

Lösung 2 : Da Sie insgesamt nur 4 Domain-Namen haben, ist es viel einfacher, den umgekehrten Ansatz zu verwenden - von JEDER Domain umzuleiten, außer der richtigen:

RewriteCond %{HTTP_HOST} !^www.newdomain.com [NC]
RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,L,NC]
LazyOne
quelle
Lösung Nr. 2 ist die bessere, aber wenn Sie www.newdomain.comund test.newdomain.comoder so etwas haben, ist es möglicherweise besser, gegen sie !newdomain.com$zu spielen, solange die alte Domain nicht mit "newdomain.com" wie "thisisanoldnewdomain.com" endet. Mehr auf den Punkt mit # 1, ich kann [OR] nirgendwo dokumentiert finden. Funktioniert das wirklich
DerfK
@DerfK docs - Sie müssen einiges scrollen: "'ornext | OR' (oder nächste Bedingung) Verwenden Sie diese Option, um Regelbedingungen mit einem lokalen ODER anstelle des impliziten UND zu kombinieren."
LazyOne
1

Habe gerade dieses Zitat gefunden:

rewriteConds gelten nur für die darauf folgende einzelne rewriteRule.

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

Hier ist die funktionierende Lösung für mich:

    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
quelle
1
Als Hinweis für alle anderen, die Jahre später hierher kommen, ist die von LazyOne oben vorgeschlagene (und von OP akzeptierte) Lösung weitaus optimierter, insbesondere wenn Sie mehr als nur zwei oder drei Bedingungen ORzusammen haben.
Doktor J