Общая проверка реферера mod_rewrite - PullRequest
7 голосов
/ 13 сентября 2011

Я ищу общий (независимый от хоста) набор правил mod_rewrite для проверки HTTP_REFERER на ресурсах. Я придумал следующее, которое казалось интуитивно понятным, но, к сожалению, не работает:

RewriteCond %{HTTP_REFERER} !^https?://%{HTTP_HOST}/.*
# RewriteRule .* - [F]  # <- or whatever

Очевидно, что вы не можете иметь переменную с обеих сторон сравнения. Итак, взломать:

RewriteCond %{HTTP_HOST}##%{HTTP_REFERER} !^([^#]*)##https?://\1/.*

Но это ужасно, и если вы не знаете точно, что происходит, это ужасно запутывает.

Есть ли лучший (более чистый) способ написания этих правил?

1 Ответ

6 голосов
/ 12 января 2012

"если вы точно не знаете, что происходит, это ужасно сбивает с толку"

Сначала поздравляю с обходным решением.Проверяя источник, mod_rewrite.c, похоже, не выполняет никакой интерполяции переменных, поэтому я не могу придумать альтернативы.Что касается вашего «запутанного» вопроса, не потому ли у нас есть комментарии?Я также привел в порядок ваше регулярное выражение (например, трейлинг. * Является избыточным) и использовал = как разделитель, чтобы подчеркнуть, что вы проводите сравнение.

Может показаться липким, но ваша идея близка к оптимальной с точки зрения времени выполнения.

#
# Is **HTTP_REFERER** of the form http(s)://HTTP_HOST/....
# Note that mod_rewrite only does interpolation in the teststring so this is
# set up in the format AAAA=BBBB and the pattern uses a backreference (\1) to
# match the corresponding elements of AAAA and BBBB
#
RewriteCond %{HTTP_HOST}==%{HTTP_REFERER} !^(.*?)==https?://\1/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...