Я понимаю, что происходит с моим кодом, почему я получаю бесконечный цикл. Итак, у меня есть следующее:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^foo/?([^/]+)?/?(.+)? /foo.php?bar=$1&baz=$2 [L,NC]
</IfModule>
Итак, что происходит, пользователь входит в foo
(или foo/a/b
) и перенаправляется на foo.php?bar=$1&baz=$2
. Но на данный момент (и именно здесь я знаю, что мне нужно более подробное объяснение, поскольку я уверен, что это сделано намеренно) файл .htaccess повторно запускается на foo.php?bar=$1&baz=$2
, что соответствует моему правилу и переходит в бесконечный цикл. Но я не знаю, почему это повторяется по моим правилам.
Что я не понимаю в .htaccess RewriteRule
с?
PS Я решил эту непосредственную проблему, разместив следующие команды перед правилом, но я хотел бы знать, почему, чтобы я мог исправить проблему в будущем (и поэтому я могу удалить эти строки и вместо этого заняться другими делами).
RewriteCondition %{REQUEST_FILENAME} !-f
RewriteCondition %{REQUEST_FILENAME} !-d
Обычно RewriteCond требуется перед RewriteRule, чтобы не совпадать с перезаписанным URL-адресом и избежать бесконечного цикла. Это одно из наиболее распространенных применений RewriteCond. Вы должны чувствовать себя хорошо, осознавая это, и не чувствовать, что делаете что-то неправильно, используя это таким образом.
Первый запрос обрабатывается, и URL-адрес перезаписывается. Это приводит к новому запросу для нового URL. Без какого-либо способа фильтрации запросов (см. Ответ Девина) вы видите правильное поведение.