如何在不对我的域名进行硬编码的情况下在 Apache 配置文件中启用热链接保护?

如何在不对我的域名进行硬编码的情况下在 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条件模式争论。

答案1

那么如何检查 Host 是否与 Referrer 匹配呢?例如

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 标头。

相关内容