.htaccess - 检查Referer匹配主机没有硬编码?

omg*_*782 6 .htaccess rewrite referer referrer hotlinking

我想做一个典型的事情,你确保一个引用者标题与你的主机匹配,使用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]
Run Code Online (Sandbox Code Playgroud)

但是,如果不将'example.com'硬编码到Rewrite条件下,我怎么能以某种方式做到这一点?我想在某种程度上尝试在引用者重写条件中使用%{HTTP_HOST},但我不确定如何匹配最后一个/域部分并将其置于其中.也许有一些方法我可以匹配主机,将结果放入变量,然后能够在下一个RewriteCond线上使用该变量?

我有点失落.谢谢你的帮助!

Der*_*rDu 7

推荐人使用.htaccess检查

引荐来源检查是一种限制Web资源使用方式的机制.具体来说,您可以使用此技术坚持只能从特定页面或站点查看文件(或者,只有在浏览器说它正在您的网站上查看文件时才会查看,如实或其他).

通常你会在htaccess文件中设置一个引用来检查,如下所示:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://www.example.com/.*
RewriteRule .*\.pdf - [NC,F]
Run Code Online (Sandbox Code Playgroud)

第一行打开重写,第二行检查"REFERER"标题(是,拼写那样)是不是以" http://www.example.com/ " 开头,第三行标记所有文件结束在".pdf"中被禁止.

这是非常有用和有用的,但它是特定于站点的.您必须更改代码以匹配您的域,有时需要在多个域中应用完全相同的代码.检查REFERER标头是否包含与标头相同的域名,这很好HOST.

理想情况下,你可以做这样的事情:

这不起作用

RewriteCond %{HTTP_REFERER} !^http://%{HTTP_HOST}/.*
Run Code Online (Sandbox Code Playgroud)

可悲的是,你不允许将一个服务器变量与另一个服务器变量进行比较RewriteCond.我们可以通过将两个变量放在条件的同一侧,然后将结果与自身进行比较来解决这个限制.像这样:

这个工作 - 随意将其复制到您自己的网站上.

RewriteEngine On
RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@https?://\1/.*
RewriteRule .*\.pdf [NC,F]
Run Code Online (Sandbox Code Playgroud)

起初这可能有点令人困惑,所以让我们通过它来理解.在比较的左侧,我们有%{HTTP_HOST}@@%{HTTP_REFERER}.因此,例如,这会产生如下字符串:tltech.com@@http://tltech.com/info.在验证规则的右侧," ^([^@]*)"表示"记住第一个@符号之前的所有内容" .然后我们跳过@@http://(或可选@@https://).然后确保下一位与我们在开始时记住的主机名匹配.然后我们确保后面跟着一个/标志.就是这样.

本质上,此规则检查HTTP_REFERER字段中的主机名是否与主机名完全相同HTTP_HOST.如果不是这样,那么最后一行告诉apache阻止指定的文件类型.

很酷,嗯?最好的部分是您可以将代码剪切并粘贴到任何主机中,而无需对其进行任何更改.只要确保最后一行与您要限制的文件类型或名称相匹配,那就太好了.


资料来源:http://tltech.com/info/referrer-htaccess/