У меня 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>