我一直在寻找一种方法来防止我的PDF文件从我网站上的直接URL访问,我发现了以下htaccess规则:
RewriteEngine On
RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@http?://1/.*
RewriteRule .*.pdf [NC,F]
尽管它看起来很完美,但我真的不明白这些@符号在RewriteCond规则中的含义。我有一些关于regex的基础知识,但在apache和regex文档中没有发现任何与之相关的内容,我发现规则的文章也没有提供任何信息。
有什么想法吗?
简短回答:
它基本上是HTTP_HOST
和%{HTTP_REFERER}
值之间的隔离符。在RewriteCond
指令中执行条件检查时匹配它们的值。
解释答案:
现在我们为什么将这些@@
字符作为2个apache变量之间的隔离符。只要我们想比较两个值是否相等或相同,就可以使用它,因为这有助于我们在捕获组中捕获值,然后如果条件中使用的反向参考值不相同,那么我们的条件就会失败。
现在来看当前的场景:
假设我们的域名是:www.example.com
CCD_ 6值为:CCD_ 7
那么%{HTTP_HOST}@@%{HTTP_REFERER}
要做的是:其价值为:www.example.com@@http://www.example.com/en-US/JavaScript
现在到康德线右侧:!^([^@]*)@@http?://1/.*
您可以看到捕获组的值为www.example.com
,当我们在http?://1
中将其用作1
时,它实际上会检查URL是否为http://www.example.com/.*
。如果它不等于,那么继续请求URI。
我们之所以这么做,基本上是因为没有直接的方法来检查URI中的两个值是否相等。
关于改进规则的建议:
RewriteEngine On
RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@http?://1/.*
RewriteRule .*.pdf/?$ - [NC,F]