Пару дней искал решение.
Как включить защиту Apache Hotlink без жесткого кодирования моего домена в файле конфигурации, чтобы я мог переносить код на другие мои домены без необходимости каждый раз обновлять файл конфигурации?
Вот что у меня есть на данный момент:
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.(com|net|org) [NC]
RewriteRule \.(gif|ico|jpe|jpeg|jpg|png)$ - [NC,F,L]
... А вот что предлагает Apache:
SetEnvIf Referer example\.com localreferer
<FilesMatch \.(jpg|png|gif)$>
Order deny,allow
Deny from all
Allow from env=localreferer
</FilesMatch>
... оба из них жестко закодировали домен в своих правилах.
Ближе всего к тому, что я нашел информацию, касающуюся этого, было прямо здесь, на ServerFault, но пришли к выводу, что это невозможно. Основываясь на моем исследовании, это кажется правдой, но я не нашел никаких вопросов или комментариев, посвященных этому вопросу.
Если кому-то интересно, вот ссылка к документации Apache 2, посвященной этой теме.
Обратите внимание, что переменные среды Apache (например, %{HTTP_REFERER}
) не может использоваться в RewriteCond
с CondPattern аргумент.
Как насчет проверки совпадения хоста с реферером? Например.
RewriteCond %{HTTP_REFERER} !%{HTTP_HOST}
редактировать
Это не сработает, как указано в OP. Для Apache 2.4 вы можете использовать:
RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'"
Для 2.2 вы могли бы написать небольшой обработчик в mod_perl или mod_python, который мог бы выполнять сравнение и выдавать ошибку 403.
Чтобы добиться этого с помощью mod_python:
Создайте файл в своем корневом каталоге (в моем случае / var / www /) с именем hotlink.py
from mod_python import apache
def headerparserhandler(req):
if req.headers_in.get("Host") != req.headers_in.get("Referer"):
return apache.HTTP_FORBIDDEN
return apache.OK
В вашей конфигурации Apache:
<Directory /var/www/>
...
AddHandler mod_python .jpg
AddHandler mod_python .gif
PythonHeaderParserHandler /var/www/hotlink.py
#PythonDebug On
</Directory>
Теперь все запросы .jpg и .gif будут сначала проверяться hotlink.py. С помощью mod_python вы также можете проверить req.server.server_hostname
атрибут для проверки ServerName
вместо входящего заголовка Host.