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>
Другие вопросы по тегам