Как включить защиту от хотлинка без жесткого кодирования моего домена в конфигурационном файле Apache?
Занимался поиском решения уже пару дней.
Как включить защиту Apache от хотлинков без жесткого кодирования моего домена в файле конфигурации, чтобы я мог переносить код на другие мои домены без необходимости каждый раз обновлять файл конфигурации?
Это то, что я до сих пор:
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.
1 ответ
Как насчет проверки, если хост соответствует рефералу? Например
RewriteCond %{HTTP_REFERER} !%{HTTP_HOST}
редактировать
Это не будет работать, как указано в ОП. Для Apache 2.4 вы можете использовать:
RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'"
Для 2.2 вы могли бы написать небольшой обработчик в mod_perl или mod_python, который мог бы выполнить сравнение и выдать ошибку 403.
Чтобы достичь этого с помощью mod_python:
Создайте файл в вашем docroot (в моем случае /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
вместо заголовка входящего хоста.