Назад | Перейти на главную страницу

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: //злой дух.com / forum /, но нет http: //мойхост.com / forum /.

Проблема в том, что последний unset не работает. Похоже, я не могу использовать свойство заголовка "Host" в качестве шаблона регулярного выражения - по крайней мере, не так, как я пытался. Конечно, я мог бы вручную ввести все возможные имена хостов в свою конфигурацию, но именно этого я хочу избежать.

Итак, мой вопрос:

Вы можете динамически заблокировать хотлинкинг, выполнив следующие действия:

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>