Как включить защиту от хотлинка без жесткого кодирования моего домена в конфигурационном файле 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 вместо заголовка входящего хоста.

Другие вопросы по тегам