Понимание того, почему сработало изменение htaccess

У меня есть 2 домена, указывающих на мой сервер. htaccess в основном таков:

RewriteCond %{HTTP_HOST} (www\.)?parkeddomain\.net [NC]
RewriteRule ^page1\.html$ https://www.newsite.net/page1/ [L,R=301,NC]
RewriteRule ^page2\.html$ https://www.newsite.net/page2/ [L,R=301,NC]

Я тоже хотел перенаправить домашнюю страницу. Итак, я использовал эти два правила в списке под тем же RewriteCond:

RewriteRule ^$ https://www.newsite.net [L,R=301,NC]
RewriteRule ^/$ https://www.newsite.net [L,R=301,NC]

Когда я добавляю эти два правила в КОНЕЦ списка RewriteRules при этом условии (которое указывает только один домен), он также перенаправлял мой ДРУГОЙ домен, очевидно, полностью игнорируя RewriteCond.

Но просто переместив эти два правила в верхнюю часть списка RewriteRules, теперь он работает так, как я хочу (например, не перенаправляет мой другой домен).

Почему это случилось?

Заранее спасибо. Просто хочу понять, почему это произошло. Единственными другими флагами, которые я использовал, был «NE» в паре перенаправлений, которые шли на ссылки с якорными ссылками (например, https://www.newsite.net/#jumptoanchorlink).

Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

RewriteCond применяется только к следующийRewriteRule в файле. Таким образом, если у вас есть 4 RewriteRule после RewriteCond, только первый из них затронут.

https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond говорит

One or more RewriteCond can precede a RewriteRule directive

Вы можете комбинировать RewriteCond с [И] (неявно) или [ИЛИ]. Но не RewriteRule.

В этой же ссылке приводится пример:

RewriteCond  "%{HTTP_USER_AGENT}"  "(iPhone|Blackberry|Android)"
RewriteRule  "^/$"                 "/homepage.mobile.html"  [L]

RewriteRule  "^/$"                 "/homepage.std.html"     [L]

Если это телефон, перейдите на мобильную страницу, в противном случае перейдите на стандартную страницу. RewriteCond относится только к первому. В противном случае все пользователи всегда будут видеть мобильную страницу в этом случае.

К вашему сведению: если вы разделите свои домены на отдельный VirtualHost, вы можете манипулировать одной конфигурацией, не влияя на другую. И он делает разделение за вас, так что вам больше не нужен RewiteCond.

По какой-то причине я, хотя все rewriterules до пустой строки, будет придерживаться приведенной выше второй перезаписи ... и ценю совет VirtualHost. Большое спасибо за обстоятельный ответ, чувак. Ваше здоровье.

irregularexpressions 11.09.2018 00:29

Другие вопросы по теме