【记录】研究.htaccess文件中的RewriteCond和RewriteRule的语法

【背景】

折腾:

【记录】给crifan.com网站设置图片防盗链

期间,想要继续去搞懂.htaccess文件中:

#Hotlink Protection
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?crifan.com/.*$ [NC]
RewriteRule \.(jpg|png)$ http://www.crifan.com/files/res/crifan_com/stealingisbad.gif [R,L]

的详细语法和含义。

【折腾过程】

1.搜:

.htaccess RewriteCond RewriteRule 语法

参考:

mod_rewrite - Apache 2.2 中文版参考手册

找到:

RewriteCond 指令

说明 定义重写发生的条件
语法 RewriteCond TestString CondPattern [flags]
作用域 server config, virtual host, directory, .htaccess
覆盖项 FileInfo
状态 扩展(E)
模块 mod_rewrite

和:

RewriteRule 指令

说明 为重写引擎定义重写规则
语法 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兼容的正则表达式,但是还有若干增补:

  1. 可以在CondPattern串的开头使用’!‘(惊叹号)来指定不匹配

所以此处

!^$

的含义是:

不匹配,空字符串(^表示起始,$表示结尾)

3.再去看看:

RewriteCond %{HTTP_REFERER} !^http://(www\.)?crifan.com/.*$ [NC]

中的:

(1) !^http://(www\.)?crifan.com/.*$

意思很清楚,就是正则表达式,含义为:

不是以

http://

开头的,后面可能有

wwww.

的,后面是crifan.com/

之后跟着一个或多个字符的

字符串

(2)[NC]

对应着:

还可以在CondPattern之后追加特殊的标记[flags]作为RewriteCond指令的第三个参数。flags是一个以逗号分隔的以下标记的列表:

  • nocase|NC‘(忽略大小写)

    它使测试忽略大小写,扩展后的TestStringCondPattern中’A-Z’ 和’a-z’是没有区别的。此标记仅用于TestStringCondPattern的比较,而对文件系统和子请求的检查不起作用。

即,此处不区分大小写

4.再去看:

RewriteRule \.(jpg|png)$ http://www.crifan.com/files/res/crifan_com/stealingisbad.gif [R,L]

(1)\.(jpg|png)$

意思是:

以.后面跟着jpg或png结尾的文件(即对应的jpg或png图片)

(2)http://www.crifan.com/files/res/crifan_com/stealingisbad.gif

此时就将之前的url地址,重新映射(改为)

http://www.crifan.com/files/res/crifan_com/stealingisbad.gif

(3)[R,L]

对应两个flag的含义:

  • redirect|R [=code]‘(强制重定向)

    Substitutionhttp://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/‘)。

    大意是:

    使用此重定向规则,并且不再继续应用其他重写规则。

     

    【总结】

    总的来说,上面的规则的含义就是:

    对于:

    http://www.crifan.com/xxx/yyy/zzz.jpg

    http://www.crifan.com/xxx/zzz.jpg

    http://crifan.com/xxx/yyy/zzz.jpg

    http://crifan.com/yyy/zzz/aaa.png

    之类的图片,如果对应的HTTP的头HTTP_REFERER的值,不是

    http://www.crifan.com/

    或:

    http://crifan.com/

    开头的

    ->

    即,如果是别的网站访问上述图片的

    那么就会被重定向到:

    防盗链的那个图片:

    http://www.crifan.com/files/res/crifan_com/stealingisbad.gif



    发表评论

    电子邮件地址不会被公开。 必填项已用*标注

    无觅相关文章插件,快速提升流量