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

Как включить защиту от хотлинков без жесткого кодирования моего домена в файле конфигурации Apache?

Пару дней искал решение.

Как включить защиту 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.