@grek_cheburek
Программист самоучка

Как в .htaccess экранировать конфликтные символы?

Доброго времени суток.
Появилась одна проблема, которую я не могу решить.
Хочу, чтобы в $_GET['url] была строка /page/info.html
Варианты могут быть разные.
/page/info/media
/blog/content.php
И так далее.
Столкнулся с тем, что в RewriteRule не могу добавить два символа. Они вызывают ошибку 500.
Если по одному добавить, то конфликта нет.
RewriteRule ^([a-zA-Z0-9-_\.\/]+)$ /index.php?url=$1 [QSA,L]

Если / убрать, тогда ошибки 500 нет.
Если убрать точку, но оставить /, тоже нет ошибки.
Но если оставить точку и /, то ошибка опять есть.
Как сделать так, чтобы эти два символа не имели конфликт?
Напомню, что параметр $_GET['url'] может изменяться.
/module/article/id/name
/page.html
/info/manual/php.html
Это примеры данных в $_GET['url'], которые я могу ожидать.
  • Вопрос задан
  • 88 просмотров
Пригласить эксперта
Ответы на вопрос 1
@dodo512
Тут дело не в экранировании символов.
Как на самом деле работает mod_rewrite.
изменение запроса не заканчивается на последнем RewriteRule. После того, как сработало последнее правило RewriteRule и был добавлен RewriteBase, mod_rewrite смотрит, изменился запрос или нет. Если запрос изменился, его обработка начинается заново с начала .htaccess.

При добавлении точки в шаблон он начинает совпадать и с index.php так что происходит зацикливание.
Исключить бесконечный цикл можно добавлением условия RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9-_./]+)$ /index.php?url=$1 [QSA,L]


Ещё вариант не ставить / перед index.php тогда mod_rewrite после перенаправления сможет понять что запрос не изменился и остановит цикл. В этом случае допонительный RewriteCond не нужен.
RewriteRule ^([a-zA-Z0-9-_./]+)$ index.php?url=$1 [QSA,L]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы