【背景】
折腾:
期间,想要继续去搞懂.htaccess文件中:
#Hotlink Protection RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www\.)?crifan.com/.*$ [NC] RewriteRule \.(jpg|png)$ https://www.crifan.com/files/res/crifan_com/stealingisbad.gif [R,L]
的详细语法和含义。
【折腾过程】
1.搜:
.htaccess RewriteCond RewriteRule 语法
参考:
mod_rewrite - Apache 2.2 中文版参考手册
找到:
“
说明 | 定义重写发生的条件 |
---|---|
语法 | RewriteCond TestString CondPattern [flags] |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 扩展(E) |
模块 | mod_rewrite |
”
和:
“
说明 | 为重写引擎定义重写规则 |
---|---|
语法 | RewriteRule Pattern Substitution [flags] |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 扩展(E) |
模块 | mod_rewrite |
兼容性 | cookie-flag在Apache 2.0.40及以后的版本中可用 |
”
然后好好看看用法。
2.先看看:
RewriteCond %{HTTP_REFERER} !^$
的含义:
(1)%{HTTP_REFERER}
对应的是:
“服务器变量 ,引用方法是:
%{
NAME_OF_VARIABLE}
”
意思是:
当HTTP头是HTTP_REFERER时
(2)!^$
而对于!^$,指的是“CondPattern”
“CondPattern是条件模式,即一个应用于当前TestString实例的正则表达式。TestString将被首先计算,然后再与CondPattern匹配。
注意:CondPattern是一个perl兼容的正则表达式,但是还有若干增补:
- 可以在CondPattern串的开头使用’
!
‘(惊叹号)来指定不匹配。
”
所以此处
!^$
的含义是:
不匹配,空字符串(^表示起始,$表示结尾)
3.再去看看:
RewriteCond %{HTTP_REFERER} !^http://(www\.)?crifan.com/.*$ [NC]
中的:
(1) !^http://(www\.)?crifan.com/.*$
意思很清楚,就是正则表达式,含义为:
不是以
开头的,后面可能有
wwww.
的,后面是crifan.com/
之后跟着一个或多个字符的
字符串
(2)[NC]
对应着:
“
还可以在CondPattern之后追加特殊的标记[flags]
作为RewriteCond
指令的第三个参数。flags是一个以逗号分隔的以下标记的列表:
- ‘
nocase|NC
‘(忽略大小写)它使测试忽略大小写,扩展后的TestString和CondPattern中’A-Z’ 和’a-z’是没有区别的。此标记仅用于TestString和CondPattern的比较,而对文件系统和子请求的检查不起作用。
”
即,此处不区分大小写
4.再去看:
RewriteRule \.(jpg|png)$ https://www.crifan.com/files/res/crifan_com/stealingisbad.gif [R,L]
(1)\.(jpg|png)$
意思是:
以.后面跟着jpg或png结尾的文件(即对应的jpg或png图片)
(2)https://www.crifan.com/files/res/crifan_com/stealingisbad.gif
此时就将之前的url地址,重新映射(改为)
https://www.crifan.com/files/res/crifan_com/stealingisbad.gif
(3)[R,L]
对应两个flag的含义:
“
redirect|R
[=code]‘(强制重定向)若Substitution以http://thishost[:thisport]/
(使新的URL成为一个URI)开头,可以强制性执行一个外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即可(或使用下列符号名称之一:temp
(默认), permanent
, seeother
)。使用它可以把规范化的URL反馈给客户端,如将"/~
"重写为"/u/
",或始终对/u/
user加上斜杠,等等。
注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上http://thishost[:thisport]/
前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使用’L’标记。
last|L
‘(结尾规则)立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last
命令或C语言中的break
命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/
‘)为实际存在的URL(比如:’/e/www/
‘)。
”
大意是:
使用此重定向规则,并且不再继续应用其他重写规则。
【总结】
总的来说,上面的规则的含义就是:
对于:
https://www.crifan.com/xxx/yyy/zzz.jpg
https://www.crifan.com/xxx/zzz.jpg
https://crifan.com/xxx/yyy/zzz.jpg
https://crifan.com/yyy/zzz/aaa.png
之类的图片,如果对应的HTTP的头HTTP_REFERER的值,不是
或:
开头的
->
即,如果是别的网站访问上述图片的
那么就会被重定向到:
防盗链的那个图片:
https://www.crifan.com/files/res/crifan_com/stealingisbad.gif