Apache 2: Referer от текущего хоста
У меня есть Apache 2 с mod_setenvif. Моя цель - остановить все горячие ссылки на изображения в моем глобальном apache.conf. В настоящее время это:
<FilesMatch ".(gif|jpg|jpeg|png)$">
SetEnvIfNoCase Referer "^http://[^/]*blogger.com/" hotlink
SetEnvIfNoCase Referer "^http://[^/]*myspace.com/" hotlink
SetEnvIfNoCase Referer "^http://[^/]*ebay" hotlink
...
deny from env=hotlink
</FilesMatch>
Пока работает хорошо, но мне нужно один раз перехватить каждый хотлинкер и добавить его в мой конфиг. Я хотел бы получить более широкую оценку, добавив что-то вроде этого:
# Set variable "hotlink" if Referer contains "forum"
SetEnvIfNoCase Referer "forum" hotlink
# Unset variable if Referer is from the same Host as current request
SetEnvIfNoCase Referer %{Host} !hotlink
План должен соответствовать http: //evilhost.com / forum /, но не http: //myhost.com / forum /.
Проблема в том, что последний сброс не работает. Похоже, я не могу использовать свойство заголовка "Host" в качестве шаблона регулярного выражения - по крайней мере, не так, как я пытался. Конечно, я мог бы вручную ввести все возможные имена хостов в моей конфигурации, но это именно то, чего я хочу избежать.
Итак, мой вопрос:
- Есть ли способ использовать заголовок HTTP в качестве шаблона регулярного выражения вообще?
- Если нет, знаете ли вы другой способ, которым я мог бы достичь своей цели, чтобы сбросить переменную "hotlink", если реферер от того же хоста?
3 ответа
Вы можете динамически заблокировать хотлинкинг, выполнив что-то вроде:
RewriteCond "%{HTTP_HOST}_%{HTTP_REFERER}" !\.?([^\.]+\.[^\.]+?)_https?://.*\1/.*$ [NC]
RewriteRule .(gif|jpg|jpeg|png)$ . [F,L]
(Это началось как комментарий, но стало слишком длинным...)
Действительно ли к вашим изображениям обращаются с помощью множества различных локальных имен хостов? Потому что на большинстве сайтов, которые я поддерживаю, любой отдельный виртуальный хост обычно связан с двумя именами хостов (обычно что-то вроде example.com и www.example.com). Вы уверены, что не пытаетесь решить проблему, которой не существует?
Вы можете сделать то, что вы хотите, используя mod_rewrite вместо FilesMatch (потому что тогда вы можете использовать %{HTTP_HOST}
в строке соответствия, что означает, что вам больше не нужно беспокоиться о вводе всех локальных имен хостов). Простой поиск в Google дает столько разных локальных имен хостов? Потому что на большинстве сайтов, которые я поддерживаю, любой отдельный виртуальный хост обычно связан с двумя именами хостов (обычно что-то вроде example.com и www.example.com). Вы уверены, что не пытаетесь решить проблему, которой не существует?
Вы можете сделать то, что вы хотите, используя mod_rewrite вместо FilesMatch (потому что тогда вы можете использовать%{HTTP_HOST} в строке соответствия, что означает, что вам больше не нужно беспокоиться о вводе всех локальных имен хостов). Простой поиск в Google дает этот сайт, который более подробно описывает использование RewriteRule для блокировки хотлинкинга.
Сверху головы (например, я действительно еще не продумал это), почему бы вам просто не изменить свою логику?
<FilesMatch ".(gif|jpg|jpeg|png)$">
SetEnvIfNoCase Referer "^http://[^/]evilhost.com/" localref
Order deny,allow
deny from all
allow from env=localref
</FilesMatch>