Как стать автором
Обновить

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]
Теги:
Хабы:
Всего голосов 47: ↑40 и ↓7 +33
Просмотры 6.3K
Комментарии Комментарии 21