这几天一直在寻找解决方案。
如何启用 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 标头。