现在正在冲浪寻找一个解决scheme。
如何启用Apache热链接保护,而不用在configuration文件中硬编码我的域,所以我可以将代码移植到我的其他域,而无需每次更新configuration文件?
这是我迄今为止:
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>
…这两个硬编码在他们的规则领域。
最接近我find任何信息覆盖这是在ServerFault这里 ,但结论是,它不能完成。 根据我的研究,这似乎是真实的,但我没有发现任何问题或评论致力于这个问题。
如果有人好奇, 这里是链接到这个主题的Apache 2文档。
请注意,Apache环境variables(例如%{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来实现这个function:
在你的docroot(在我的情况下/ var / www /)中创build一个名为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
在你的Apacheconfiguration:
<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头。