使用白名单htaccess停止图像热链接

时间:2015-01-02 08:33:31

标签: regex image .htaccess

一个大图片节目版需要一个带有白名单的热链接脚本,用于google,bing,yahoo等。 在网络上我发现了许多例子,但它们的语法不同。

示例1:

RewriteCond %{HTTP_REFERER} !^http://(.+\.)?google/.*$ [NC]

示例2:

RewriteCond %{HTTP_REFERER} !google\. [NC]

示例3:

RewriteCond %{HTTP_REFERER} !google. [NC] 

示例4:

SetEnvIfNoCase Referer "^(http|https)://.*google.*" whitelist

示例5:

RewriteCond %{HTTP_REFERER} !^http://(.+\.)?google/.*$ [NC]

问题1:使用域通配符哪一个最快且正确? 问题2:为什么在示例5中不需要http:// infront?

我做了什么

RewriteCond %{HTTP_REFERER}  !my-domain\.                   [NC]
RewriteCond %{HTTP_REFERER}  !search\?q=cache               [NC]
RewriteCond %{HTTP_REFERER}  !google\.                      [NC]
RewriteCond %{HTTP_REFERER}  !twitter\.                     [NC]
RewriteCond %{HTTP_REFERER}  !facebook\.                    [NC]
RewriteCond %{HTTP_REFERER}  !googleusercontent\.           [NC]
RewriteCond %{HTTP_REFERER}  !bing\.                        [NC]
RewriteCond %{HTTP_REFERER}  !pinterest\.                   [NC]
RewriteCond %{HTTP_REFERER}  !yahoo\.                       [NC]
RewriteCond %{REQUEST_URI}   !^/hotlink\.jpg$               [NC]

RewriteRule \.(gif|jpg|png)$ http://domain.tld/hotlink.jpg  [R,NC,L]

问题3:只有1行是否更快?我怎么写这个

google|facebook|bing|etc

我做了什么:

RewriteCond %{HTTP_REFERER}  !my-domain\. [NC]
RewriteCond %{HTTP_REFERER} !(google|googleusercontent|yahoo|bing|facebook|pinterest|etc.) [NC]
RewriteCond %{REQUEST_URI}   !^/hotlink\.jpg$               [NC]
RewriteRule \.(gif|jpg|png)$ http://my-domain.tld/hotlink.jpg  [R,NC,L]

1 个答案:

答案 0 :(得分:0)

嗯,不是很科学,但我的猜测是ored选项最长。

我使用此正则表达式对http://www.regex101.com进行了尝试:(google|googleusercontent|yahoo|bing|facebook|pinterest)以匹配http://www.yahoo.com

花了87个步骤(您可以在网站上的regex调试器中看到它),只需要7个步骤就可以匹配正则表达式yahoo

所以大约7乘9(RewriteCond的数量)给出63步,其中reored正则表达式采取87步,所以我认为在任何情况下使用简单的正则表达式和多个RewriteCond会更快,直到步骤交叉(正则表达式将采取可预测的步数,尝试完整的ored和最后的匹配,以了解最大步骤)。

再一次:没有什么科学的东西和myabe它需要花费更多的时间来调用9测试而不是复杂的测试,也许在调试模式下的apache可以告诉时间,但我不确定。

选择一个而不是另一个仍然是一个选择问题,因为我很确定在serer因请求数量而无法停止之前它不会做出明显的区别。


对于匹配domain\.,我认为不需要使用更复杂的东西,也许你可能会遇到一些边缘情况,其中domain.在其他地方的引用者。

点之前的\对于匹配一个小点而不是正则表达式中domain之后的任何字符都很重要。