Website development
20 November 2009

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]

+33
5.5k 145
Comments 21