Назад | Перейти на главную страницу

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

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

По причинам SEO мне нужно переписать весь трафик веб-сайта на основное новое доменное имя (например, www.newdomain.com). К сожалению, я не знаю, как добавить несколько условий перезаписи типа ИЛИ. Кажется, что при всех условиях, пример кода ниже, я получаю условие И.

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

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

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

Решение # 1: Заменить [NC] по [NC,OR] в первых двух строках исходного кода 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]

Только что нашел эту цитату:

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]