Ответ 1
Правило [L]
работает отлично - вы просто не знаете, как это работает .
Когда Apache видит флаг [L]
и совпадают правила (переписывание происходит), Apache перейдет к следующей итерации и снова начнет сопоставлять правила all сверху. Флаг [L]
означает "не обрабатывать никакие правила ниже в этой итерации".
Да, Документация Apache не является на 100% понятной (что означает, что она может быть улучшена), но дает достаточно информации, чтобы понять это в конечном итоге.
Apache остановит цикл перезаписи в нескольких ситуациях:
-
Совместимые правила (без перезаписи);
-
Соответствует правилу "exit now" (например,
RewriteRule .* - [L]
); -
Переписывание происходит, но входной URL-адрес и конечные URL-адреса одинаковы (происходит на 2-й-3-й итерации, когда "плохое" письменное правило переписывает один и тот же URL-адрес на один и тот же URL-адрес.
Например
RewriteRule (.*) /index.php?page=$1 [L]
:-
/hello
= >/index.php?page=hello
- на следующей итерации он перепишет
/index.php
= >/index.php?page=index.php
- а на третьей итерации это будет
/index.php
= >/index.php?page=index.php
.., который теперь не имеет смысла);
-
-
Достигнута предел итерации переименования (по умолчанию = 10) - если вы ввели бесконечный цикл перезаписи (значение управляется LimitInternalRecursion Directive).
Со всей вышеупомянутой информацией я могу сказать, что ваши текущие правила работают как ожидалось. Это означает, что вам нужно изменить логику и избавиться от последнего правила (возможно, справиться с этим моментом в родительском .htaccess.. или обрабатывать его по-другому - все зависит от того, как ваше приложение построено, я не хочу делать дикие догадки).