mod_rewrite: Просмотр списка правил только один раз
С mod_rewrite есть одна проблема, об которую набиты уже наверное 15 миллионов шишек : он просматривает список правил снова и снова, пока URL удается хоть как-то изменить.Очень часто получаеются и бесконечные циклы(например добавление расширения - оно добавляется снова и снова, если специально регэкспом не ограничить), над которыми с непривычки приходится поломать голову. Все надежды на модификатор [L] тщетны - он лишь сразу запускает следующую иттерацию обработки. Да и без бесконечного цикла лишние иттерации скорости работы не добавляют :-)
Хочу поделится достаточно простым и универсальным средством борьбы с такой особенностью, который обнаружил только-что :-)
RewriteCond %{ENV:REDIRECT_FINISH} !^$
RewriteRule ^ - [L]
#Дальше сколько угодно правил
RewriteRule ^/?page/([a-z]+)$ read.php?page=$1 [E=FINISH:1,L,QSA]
RewriteRule ^.*$ 404.php [E=FINISH:1,L]
Что тут происходит? Как только мы произвели окончательное преобразование URL-а - выставляем переменную окружения FINISH, и на следующей иттерации Апач скопирует старые перменные окружения с префиксом REDIRECT_, увидет установленный REDIRECT_FINISH и закончит работу. Телемаркет :-)
PS: Встроенный rewrite-engine в nginx лишен этой проблемы с рождения, но это так, к слову ;-)
UPDATE: В коментах предолжили еще короче, с безусловным обрубанием всего после первой иттерации:
# Don't loop.
RewriteCond %{ENV:REDIRECT_STATUS} !^$
RewriteRule .* — [L]