一个大图片节目版需要一个带有白名单的热链接脚本,用于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]
答案 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
之后的任何字符都很重要。