mod_rewrite: просмотр списка правил только один раз
У модуля mod_rewrite сервера «Апач» есть особенность, которая иногда портит много крови — после каждого переписывания URL, он просматривает список правил снова. Если ничего не предпринять, иногда происходит зацикливание, что ввергает новичков в ступор.
Мне эта особенность ни разу не пригодилась, но избавляться от неё приходится постоянно. В комментариях на «Хабре» к статье, название которой я вынес в заголовок, подсказали очень хороший способ, добавить первым правилом следующее:
# Don't loop.
RewriteCond %{ENV:REDIRECT_STATUS} !^$
RewriteRule .* - [L]Если перезапись URL уже происходила, то любой URL оставляем без изменений и следующего цикла обработки уже не происходит.
Комментарии 10
Выше просто проверяется на непустоту переменная окружения (об этом говорит «EVN:») «REDIRECT_STATUS» (!^$ — это просто «не пустая строка», где «^$» — пустая регулярка, где написано «начало и конец строки»).
Если она не пустая, то разрешается сработать правилу ниже (правило записывается через директиву RewriteRule), в правиле написана регулярка («.*» — «всё что угодно, включая пустоту») и во что она переписывается
Поскольку, в случае срабатывания RewriteCond и RewriteRule строка URL остаётся без изменений (у нас же
…а nginx — это да. У него и возможности по реврайтам апачу не уступают. Видимо
Ну, традиционное решение — делать ещё правила для URL, которых не надо перезаписывать. Например:
RewriteRule ^/index\.php$ — [L]
RewriteRule .* /index.php [L]
Реально на диске есть статика (картинки, css и т.п.) и
Что значит «пользователь заведёт
Например, на диске лежит файл /lib/common.php, и пользователь решил завести такой же URL в CMS. Кривой пример, но другой придумывать не зачем — это же иллюстрация.
Не. Пользователь не может завести такой урл в CMS. Он может заводить только каталоги и «файлы».html. Ну и заливать статику в специально отведённый каталог.
Имена каталогов могут теоретически пересекаться, но пользователь сам себе не враг и зачем ему могут понадобиться каталоги css, js и i, я не знаю
Мало ли зачем. Да и непонятно зачем ограничивать пользователя созданием только «.html».