如何启用热链接保护,而不用在Apacheconfiguration文件中硬编码我的域名?

现在正在冲浪寻找一个解决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}不能RewriteCondCondPattern参数中使用。

如何检查主机是否与推荐人相匹配? 例如

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