Apache переписати кілька умов


9

У мене є веб-сайт, який переміщений зі старого доменного імені (наприклад, olddomain.com) на нове доменне ім’я (наприклад, newdomain.com).

З SEO причини мені потрібно переписати весь трафік веб-сайту на нове основне доменне ім’я (наприклад, www.newdomain.com). На жаль, я не знаю, як додати декілька умов перезапису типу АБО. Здається, що з усіма умовами, зразком коду нижче, я отримую стан 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>

Хтось може мені трохи допомогти? Будь-яка допомога буде дуже вдячна.

Відповіді:


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]

Рішення # 2, тим краще один, хоча , якщо у вас є www.newdomain.comі test.newdomain.comчи що - щось подібне, було б краще , щоб відповідати проти !newdomain.com$тих пір , поки старий домен не закінчується в «newdomain.com» , як «thisisanoldnewdomain.com». Якщо говорити про номер 1, я ніде не можу знайти [АБО] документально підтвердженого. Це справді працює?
DerfK

Документи @DerfK - вам доведеться прокручувати зовсім небагато: "'ornext | OR' (або наступна умова) Використовуйте це для комбінування умов правила з локальним АБО замість неявного AND."
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]

1
Як зауваження для всіх, хто відвідує тут років через рік, рішення, запропоноване LazyOne вище (і прийняте ОП), є значно оптимізованішим, особливо якщо у вас більше двох-трьох умов ORразом.
Doktor J
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.