Флаг L
говорит: «не выполнять больше правил в наборе правил», что, как ни странно, не означает, что к 100 * * больше не будут выполняться правила.
Когда вы указываете директивы mod_rewrite
в контексте для каждого каталога, например, в разделе .htaccess
или Directory
конфигурации сервера или виртуального сервера, перезапись происходит поздно на этапе обработки Apache. Чтобы сделать свое дело здесь, mod_rewrite
должен выполнять внутреннее перенаправление каждый раз, когда ваш URL перезаписывается.
Поскольку ваше переписывание может указывать вам на другой каталог, mod_rewrite
назначает себя в качестве обработчика для этого перенаправления, чтобы он мог выполнять любые правила, которые он может найти в новом месте, в которое вы отправили запрос. Зачастую, поскольку вы имеете дело только с одним .htaccess
файлом в корне, правила в «новом» месте оказываются теми, которые вызвали перезапись в первую очередь.
Итак, в вашем случае происходит следующее:
- Запрос сделан для
/css/A01EF
mod_rewrite
запускает набор правил
^css/([0-9a-fA-F]{32})$ -> assets.php?hash=A01EF
L
флаг останавливает перезапись и вызывает внутреннее перенаправление на assets.php?hash=A01EF
mod_rewrite
снова запускает набор правил
^([a-zA-Z0-9_.-]+)$
-> index.php?url=assets.php&hash=A01EF
(кстати, вы можете использовать QSA
здесь)
L
флаг останавливает перезапись и вызывает внутреннее перенаправление на index.php?url=assets.php&hash=A01EF
Вероятно, этот цикл продолжится, но mod_rewrite
распознает, что вы перенаправляете на ту же страницу, и игнорирует переписывание после этой точки.
Весь этот процесс объясняет, почему два условия ...
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
... так часто встречаются в наборах правил .htaccess
mod_rewrite
, поскольку они предоставляют простой способ определить, был ли URL уже переписан для предполагаемого реального ресурса. Вы можете использовать их или исключить перезапись index.php
, когда запрос переписан на assets.php
:
RewriteCond %{REQUEST_URI} !^/assets.php
RewriteRule ^([a-zA-Z0-9_.-]+)$ index.php?url=$1&%{QUERY_STRING} [L]