.htaccess - 检查Referer匹配没有硬编码的主机?
Posted
技术标签:
【中文标题】.htaccess - 检查Referer匹配没有硬编码的主机?【英文标题】:.htaccess - Check Referer Matches Host Without Hard Coding? 【发布时间】:2013-09-18 18:40:18 【问题描述】:我想做一个典型的事情,即使用 htaccess 确保引荐来源标头与您的主机匹配。但是我想这样做而不对域名进行硬编码,因此 htaccess 代码可以很容易地在许多站点中重复使用。
我知道这是典型的做法。假设我在 WWW.example.com 有一个主服务器,在 IMG.example.com 有一个图像服务器:
RewriteCond %HTTP_HOST !^(www\.)
RewriteCond %HTTP_REFERER !^$
RewriteCond %HTTP_REFERER !https?://(([^\.]+)\.)?example\.com/ [NC]
RewriteRule DO SOMETHING HERE [L]
但是如果不将“example.com”硬编码到重写条件中,我怎么能以某种方式做到这一点呢?我正在考虑尝试以某种方式在引用者重写条件中使用 %HTTP_HOST ,但我不确定如何仅匹配最后一个/域部分并将其带入。也许有某种方法可以匹配主机,将结果放入变量中,然后能够在下一个 RewriteCond 行中使用该变量?
我有点失落。感谢您的帮助!
【问题讨论】:
好问题 - 我自己正在寻找这个问题的答案... 【参考方案1】:使用 .htaccess 检查引荐来源网址
Referrer 检查是一种限制网络资源使用方式的机制。具体来说,您可以使用此技术来坚持仅从特定页面或站点查看文件(或者,更确切地说,仅在浏览器说它正在查看您站点上的文件时才查看,无论是否真实)。
通常你会像这样在 htaccess 文件中设置引用者检查:
RewriteEngine On
RewriteCond %HTTP_REFERER !^http://www.example.com/.*
RewriteRule .*\.pdf - [NC,F]
第一行打开重写,第二行检查“REFERER”标题(是的,拼写方式)是否不以“http://www.example.com/”开头,第三行标记所有以“.pdf”结尾的文件” 被禁止。
这很漂亮而且很有用,但它是特定于站点的。您必须更改代码以匹配您的域,有时需要在多个域中应用完全相同的代码。最好检查一下REFERER
标头是否与HOST
标头包含相同的域名。
理想情况下,您可以这样做:
这不起作用
RewriteCond %HTTP_REFERER !^http://%HTTP_HOST/.*
遗憾的是,您不能在 RewriteCond
中将一个服务器变量与另一个服务器变量进行比较。我们可以通过将两个变量放在条件的同一侧,然后将结果与自身进行比较来解决此限制。像这样:
这个可行 - 随意将其复制到您自己的网站上。
RewriteEngine On
RewriteCond %HTTP_HOST@@%HTTP_REFERER !^([^@]*)@@https?://\1/.*
RewriteRule .*\.pdf [NC,F]
起初这可能有点令人困惑,所以让我们推理一下。在比较的左侧,我们有%HTTP_HOST@@%HTTP_REFERER
。例如,这将产生一个像这样的字符串:tltech.com@@http://tltech.com/info
。在验证规则的右侧,“^([^@]*)
”表示“记住第一个 @
符号之前的所有内容。然后我们跳过@@http://
(或可选的@@https://
)。然后确保下一位与我们在开始时记住的主机名匹配。然后我们确保后面跟着一个/
符号。就是这样。
本质上,此规则检查HTTP_REFERER
字段中的主机名是否与HTTP_HOST
中的主机名完全相同。如果不是这样,那么最后一行告诉 apache 阻止指定的文件类型。
很酷,嗯?最好的部分是您可以将代码剪切并粘贴到任何主机中,而无需对其进行任何更改。只需确保最后一行与您要限制的文件类型或名称相匹配,就可以了。
来源:http://tltech.com/info/referrer-htaccess/
【讨论】:
既然已经有了最准确的答案,为什么还要重新发明***?关于“副本”..为了安全起见,仅链接是邪恶的;-) 综合,不反刍,参考。 此列表中的第一项必须命名为:帮助他人 ;-) 但我明白你的意思..以上是关于.htaccess - 检查Referer匹配没有硬编码的主机?的主要内容,如果未能解决你的问题,请参考以下文章