Я пытаюсь переписать этот URL следующим образом:
fr.example.com/tag/movies
» example.com/catch.php?country=fr&tag=movies
example.com/tag/movies
» example.com/catch.php?tag=movies
fr.example.com
» domain.com/catch.php?country=fr
для них у меня есть следующие правила mod_rewrite в файле .htaccess
субдомен + тег
RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.com [NC]
RewriteRule ^tag/([^/]+) catch.php?country=%1&tag=$1 [L,NS]
тег
RewriteRule ^tag/([^/]+) catch.php?tag=$1 [L,NS]
субдомен
RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.com [NC]
RewriteRule ^(.*)$ catch.php?country=%1 [L,NS]
именно в таком порядке.
Сейчас L
после первого RewriteRule
должен прекратить обработку и перенаправить его на URL-адрес субдомена + тега, но это не так. Например, fr.example.com/tag/movies
отправляется catch.php?country=fr
, что является последним условием в .htaccess
файл.
Разве это не должно прекратиться после первого L
находится?
ОТВЕТ
Что ж, оказывается, что [L]
flag работает по-разному в зависимости от контекста (.htaccess
/<Directory>
отличный от httpd.conf
) как вы видете Вот.
Итак, чтобы это работало, просто поместите правила внутри <VirtualHost>
(НЕ <Directory>
) и добавить /
к каждому URI (/catch.php
, /tag
, ...). Вот и все.
Флаг L не останавливает обработку ни при каких обстоятельствах. Я бы посоветовал проверить этот поток на Stack Overflow, особенно ссылку на руководство по перезаписи Apache, а также включение RewriteLog, чтобы вы могли проверить, как mod_rewrite обрабатывает ваши правила.