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

Приоритет RewriteRules в файле .htaccess на сервере Apache

В моем файле .htaccess есть несколько правил RewriteRules. Однако одно конкретное правило выполняется только в том случае, если я удалю другое конкретное правило, независимо от того, как я упорядочиваю эти два правила.

Вот правило, имеющее более низкий приоритет:

RewriteRule ^([0-9]+)$ /beta/forward.php?id=$1 [L]

И вот правило, которое всегда имеет приоритет:

RewriteCond %{HTTP_HOST} ^domain1\.net$ [NC]
RewriteRule ^(.*)$ http://domain2.net/$1 [R=301,L]

И domain1, и domain2 фактически указывают на один и тот же веб-сайт. Итак, когда оба правила находятся в файле .htaccess и я получаю доступ

http://domain1.net/123

Второе правило выполняется первым, и я получаю два перенаправления, сначала на http://domain2.net/123 а затем (когда имя хоста больше не соответствует второму правилу) для http://domain2.net/beta/forward.php?id=123. Я попытался исправить второе правило, чтобы оно никогда не выполнялось для URL-адресов, которые содержат только числа, но я должен делать что-то не так, потому что это по-прежнему выполняется:

RewriteCond %{HTTP_HOST} ^ domain1\.net$ [NC]
RewriteRule ^(.*[^0-9]+.*)$ http://domain2.net/$1 [R=301,L]

Удалив только две строки из файла .htaccess, я могу сразу получить первое правило для обработки запроса.

Любая помощь будет принята с благодарностью.

В ваших правилах указаны эти процедуры:

Если URL-адрес состоит только из чисел, перейдите к URL-адресу бета-версии, за которым следуют эти числа и остановитесь.

Если вы посещаете домен 1, перейдите по тому же URL-адресу в домене 2 и остановитесь.

Когда L встречается или правила завершены, обработка завершается. Все остальное - это новое соединение из браузера. Возможно, это вас смущает - порядок имеет значение, а затем совпадения. В L должны позаботиться о вашей проблеме, когда они в порядке:

RewriteEngine on

RewriteRule ^([0-9]+)$ /beta/forward.php?id=$1 [L] # конец обработки [L], если он только числовой

RewriteCond %{HTTP_HOST} ^domain1\.net$ [NC] # если совпадение domain1.net без учета регистра…

RewriteRule ^(.*)$ http://domain2.net/$1 [R=301,L] # перенаправить на domain2.net. Конец [L]

Думаю, вам стоит проверить флаги правил перезаписи (http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewriterule) обратите внимание на то, что делают флаги C и L.