Apache przepisuje wiele warunków

9

Mam witrynę internetową, która została przeniesiona ze starej nazwy domeny (np. Olddomain.com) do nowej nazwy domeny (np. Newdomain.com).

Ze względów SEO muszę przepisać cały ruch w witrynie na podstawową nową nazwę domeny (np. Www.newdomain.com). Niestety nie wiem, jak dodać wiele warunków przepisywania typu LUB. Wygląda na to, że przy wszystkich warunkach, przykładowy kod poniżej, otrzymuję warunek ORAZ.

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

Czy ktoś może mi pomóc? Każda pomoc byłaby bardzo mile widziana.

gurun8
źródło

Odpowiedzi:

16

Pomimo tego, że już pracujesz dla twojego rozwiązania, nadal będę to publikować, ponieważ twoje jest dalekie od optymalności.

Rozwiązanie nr 1 : Wymień [NC]przez [NC,OR]w pierwszych 2 linie RewriteCond oryginalnego kodu. Domyślnie jeden RewriteCond jest połączony z innym RewriteCond logicznie AND. To poinstruuje Apache, aby używał ORlogiki:

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]

Rozwiązanie nr 2 : Ponieważ w sumie masz tylko 4 nazwy domen, o wiele łatwiej będzie zastosować odwrotne podejście - przekierowanie z dowolnej domeny oprócz poprawnej:

RewriteCond %{HTTP_HOST} !^www.newdomain.com [NC]
RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,L,NC]
LazyOne
źródło
Rozwiązanie nr 2 jest lepsze, ale jeśli masz www.newdomain.comi test.newdomain.comcoś w tym rodzaju, lepiej dopasować, !newdomain.com$dopóki stara domena nie zakończy się na „newdomain.com” jak „thisisanoldnewdomain.com”. Co więcej, z numerem 1 nie mogę nigdzie znaleźć [OR] udokumentowanego. Czy to naprawdę działa?
DerfK
@DerfK docs - musisz przewinąć całkiem sporo: „ornext | OR” (lub następny warunek) Użyj tego, aby połączyć warunki reguły z lokalną OR zamiast niejawnego AND. ”
LazyOne
1

Właśnie znalazłem ten cytat:

rewriteConds mają zastosowanie tylko do pojedynczej reguły rewriteRule, która następuje po nich.

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

Oto dla mnie działające rozwiązanie:

    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
źródło
1
Uwaga dla wszystkich osób, które odwiedzą tutaj lata później, rozwiązanie zaproponowane przez LazyOne powyżej (i zaakceptowane przez OP) jest znacznie bardziej zoptymalizowane, szczególnie jeśli masz więcej niż tylko dwa lub trzy warunki OR.
Doktor J