mod_rewrite规则中@符号的含义解析——PDF防盗链.htaccess规则疑问
拆解.htaccess规则中@符号的作用
嘿,这个问题问得很细节!我来给你解释清楚这个@符号到底是干嘛的~
首先,我们先看这条RewriteCond的完整结构:
RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@http?://\1/.*
这里的@@其实是自定义的分隔符,目的是把%{HTTP_HOST}(当前请求的域名)和%{HTTP_REFERER}(请求的来源页面URL)这两个Apache环境变量拼接成一个单一的字符串,方便用正则表达式同时对比两者的关系。
举个实际例子:
- 如果当前域名是
example.com,请求来源是http://example.com/article.html,拼接后的字符串就是example.com@@http://example.com/article.html - 如果是直接通过URL访问PDF(没有referer),拼接后的字符串就是
example.com@@(或者只有example.com,取决于服务器配置)
接下来看正则部分!^([^@]*)@@http?://\1/.*:
([^@]*):匹配第一个@符号之前的所有内容,也就是捕获到当前的域名(%{HTTP_HOST}的值)@@:就是我们加的分隔符,用来精准定位到拼接字符串里两个变量的分界点http?://\1/.*:检查拼接字符串的后半部分(也就是%{HTTP_REFERER})是否以http://或https://开头,后面跟着刚才捕获的域名,再加上任意路径内容
整个条件的意思是:当请求的来源页面域名和当前网站域名不一致,或者没有来源页面(直接URL访问)时,就触发后面的RewriteRule,返回403禁止访问(F标记)。
为什么要用@@而不是单个@?其实主要是为了避免极端情况——虽然正常情况下%{HTTP_HOST}(域名)和%{HTTP_REFERER}(URL)里不会出现@符号,但用两个@作为分隔符,能进一步确保分隔的唯一性,避免正则匹配出错。
简单来说,这里的@符号没有特殊的Apache或正则语法含义,只是一个用来分隔两个变量的普通字符,让我们能在一个正则表达式里同时验证域名和来源的一致性~
内容的提问来源于stack exchange,提问作者LlamaSkot
相关产品推荐
相关产品推荐

