Сравнение серверных переменных Apache в условиях RewriteCond

archive view archive save

mod_rewrite-logoМногие безуспешно пытались сравнивать серверные переменные Apache из TestString в правой части условия CondPattern директивы RewriteCond, а некоторые упорные, несмотря на постоянные "фэйлы", продолжают пытаться это делать и по сей день.

Apache 2.0-2.2 и переменные в условиях RewriteCond

Проблема в том, что CondPattern не расшаривает переменные %{VAR} доступные в TestString, а также $N или %N обратные ссылки на группы из CondPattern предыдущих RewriteCond - ну, не предусмотрено документацией и всё тут!

CondPattern же является perl-совместимым регулярным выражением с небольшим дополнением, а потому на примере проверки "реферера" следующие условия работать не будут:

RewriteCond %{HTTP_REFERER} !^https?://%{HTTP_HOST}/*
RewriteRule "^/images" "-" [F]
 
RewriteCond %{HTTP_HOST} ^(.*)$
RewriteCond %{HTTP_REFERER} !^https?://%1/*
RewriteRule "^/images" "-" [F]

Делаем ход костылём

В строку TestString одновременно заряжаем значение переменных %{HTTP_HOST} и
%{HTTP_REFERER} разделив их условным разделителем, "@@" в нашем случае (может быть и "#" или просто пробел), а в CondPattern сравниваем эту строку целиком предварительно сгруппировав ([^@]*) все символы расположенные до разделителя - там у нас значение %{HTTP_HOST}.

Далее в шаблоне условий через обратную ссылку на группу с индексом №1 ("\1") подставляем содержащееся там значение %{HTTP_HOST}.

RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@https?://\1/.*
RewriteRule "^/images" "-" [F]

Apache 2.4 и переменные в условиях RewriteCond

В Apache 2.4 и старше появился свой движок для обработки регулярных выражений, и чтобы им воспользоваться нужно в TestString указать специальное значение в виде ключевого слова "expr":

RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'"
RewriteRule "^/images" "-" [F]

Об авторе
Иван Шаман
Меня нет ни в Инстаграмме ни в Фейсбуке, я просто хожу по улицам и рассказываю первым встречным: сколько зарабатываю; с кем дружу; где живу и чем дышу. У меня даже появилось несколько подписчиков: ПСИХоЛОХ и участковый полицай!
Ещё статьи автора
Комментарии в блоге
Новое на форуме