我有一个mod_setenvif的Apache 2。 我的目标是停止在我的全局apache.conf中的图像的所有盗链。 目前是:
<FilesMatch ".(gif|jpg|jpeg|png)$"> SetEnvIfNoCase Referer "^http://[^/]*blogger.com/" hotlink SetEnvIfNoCase Referer "^http://[^/]*myspace.com/" hotlink SetEnvIfNoCase Referer "^http://[^/]*ebay" hotlink ... deny from env=hotlink </FilesMatch>
到目前为止工作很好,但我必须捕捉每一个hotlinker一次,并将其添加到我的configuration。 我想通过添加如下内容来获得更广泛的评价:
# Set variable "hotlink" if Referer contains "forum" SetEnvIfNoCase Referer "forum" hotlink # Unset variable if Referer is from the same Host as current request SetEnvIfNoCase Referer %{Host} !hotlink
计划是匹配http:// evilhost .com / forum / ,而不是http:// myhost .com / forum / 。
问题是后者未设置不起作用。 看起来好像我不能使用标题属性“主机”作为正则expression式模式 – 至less不是我试图的方式。 当然,我可以在我的configuration中手动input所有可能的主机名,但这正是我想要避免的。
所以我的问题是:
(这开始是一个评论,但太长了…)
您的图片真的被许多不同的本地主机名称访问吗? 因为在我维护的大多数网站上,任何单独的虚拟主机通常与两个主机名(通常是example.com和www.example.com)相关联。 你确定你没有试图解决一个不存在的问题吗?
你可以用mod_rewrite而不是FilesMatch来做你想做的事(因为你可以在你的匹配string中使用%{HTTP_HOST} ,这意味着你不再需要担心input所有的本地主机名)。 一个简单的谷歌search产生许多不同的本地主机名? 因为在我维护的大多数网站上,任何单独的虚拟主机通常与两个主机名(通常是example.com和www.example.com)相关联。 你确定你没有试图解决一个不存在的问题吗?
你可以用mod_rewrite而不是FilesMatch来做你想做的事(因为你可以在你的匹配string中使用%{HTTP_HOST},这意味着你不再需要担心input所有的本地主机名)。 一个简单的谷歌search产生这个网站 ,这更详细地介绍了使用RewriteRule的阻止盗链。
您可以通过执行以下操作来dynamic阻止盗链:
RewriteCond "%{HTTP_HOST}_%{HTTP_REFERER}" !\.?([^\.]+\.[^\.]+?)_https?://.*\1/.*$ [NC] RewriteRule .(gif|jpg|jpeg|png)$ . [F,L]
除了我的头上(例如,我还没有真正想过这个),为什么你不要扭转你的逻辑?
<FilesMatch ".(gif|jpg|jpeg|png)$"> SetEnvIfNoCase Referer "^http://[^/]evilhost.com/" localref Order deny,allow deny from all allow from env=localref </FilesMatch>