Apache переписать несколько условий

9

У меня есть веб-сайт, который был перенесен со старого доменного имени (например, olddomain.com) на новое доменное имя (например, newdomain.com).

По причинам SEO мне нужно переписать весь трафик веб-сайта на основное новое доменное имя (например, www.newdomain.com). К сожалению, я не знаю, как добавить несколько условий перезаписи типа OR. Кажется, что при всех условиях, пример кода ниже, я получаю условие 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>

Может ли кто-нибудь оказать мне небольшую помощь? Любая помощь будет принята с благодарностью.

gurun8
источник

Ответы:

16

Несмотря на то, что вы уже нашли подходящее для вас решение, я все равно опубликую это, поскольку ваше решение далеко не оптимально.

Решение № 1 : Заменить [NC]на [NC,OR]первые 2 строки RewriteCond исходного кода. По умолчанию один RewriteCond связан с другим RewriteCond логическим AND. Это научит Apache использовать ORлогику:

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]

Решение № 2 : Поскольку у вас всего 4 доменных имени, будет гораздо проще использовать противоположный подход - перенаправление с ЛЮБОГО домена, кроме правильного:

RewriteCond %{HTTP_HOST} !^www.newdomain.com [NC]
RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,L,NC]
LazyOne
источник
Решение # 2, тем лучше один, хотя , если у вас есть www.newdomain.comи test.newdomain.comили что - то подобное, было бы лучше , чтобы соответствовать против !newdomain.com$тех пор , пока старый домен не заканчивается в «newdomain.com» , как «thisisanoldnewdomain.com». Если говорить о # 1, я не могу найти [ИЛИ] документированных где-либо. Это действительно работает?
DerfK
@DerfK docs - вам нужно прокрутить немного: «ornext | OR» (или следующее условие) Используйте это для объединения условий правила с локальным ИЛИ вместо неявного И ».
LazyOne
1

Просто нашел эту цитату:

rewriteConds применяются только к одному rewriteRule, который следует за ними.

здесь: http://www.webmasterworld.com/apache/3350200.htm

Вот рабочее решение для меня:

    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
источник
1
Как примечание для всех, кто посетил здесь несколько лет спустя, решение, предложенное LazyOne выше (и принятое OP), гораздо более оптимизировано, особенно если у вас есть более двух или трех условий для ORсовместной работы.
Доктор Джей