URL重定向之RewriteCond 指令
RewriteCond 指令是用来定义触发重写的条件的。即在一个RewriteRule指令之前可以有一个或多个RewriteCond指令。条件之后的重写规则仅在当前URI 与Pattern匹配并且满足此处的条件时才会起作用。
RewriteCond指令的语法如下:
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
RewriteRule ^/$ /homepage.max.html [L]
%{HTTP_USER_AGENT} 此时指的是用户的浏览器标识,上面的转写语句的意思是:当用户的浏览器标识为Mozilla,访问主页的时候,跳转到homepage.max.html页。类似%{HTTP_USER_AGENT}这样的的变量有很多,常用的有%{HTTP_HOST}, %{QUERY_STRING}等等。
注:RewriteCond的第二个参数是一个perl兼容的正则表达式,但是还有若干增补:
1.可以在表达式的开头使用’!'(惊叹号)来指定不匹配。
RewriteCond %{HTTP_HOST} !^smartwei\.com [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.*) http://smartwei.com/$1 [L,R]
将站内所有不适以smartwei.com开头的链接都转化为以http://smartwei.com/开头的形式。
2.除了正则表达式的标准用法,还有下列用法
- ‘<CondPattern’(词典顺序的小于)
将CondPattern视为纯字符串,与TestString按词典顺序进行比较。如果TestString小于CondPattern则为真。 - ‘>CondPattern’(词典顺序的大于)
将CondPattern视为纯字符串,与TestString按词典顺序进行比较。如果TestString大于CondPattern则为真。 - ‘=CondPattern’(词典顺序的等于)
将CondPattern视为纯字符串,与TestString按词典顺序进行比较。如果TestString等于CondPattern(两个字符串逐个字符地完全相等)则为真。如果CondPattern是”"(两个双引号),则TestString将与空字符串进行比较。 - ‘-d’(目录)
将TestString视为一个路径名并测试它是否为一个存在的目录。 - ‘-f’(常规文件)
将TestString视为一个路径名并测试它是否为一个存在的常规文件。 - ‘-s’(非空的常规文件)
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。 - ‘-l’(符号连接)
将TestString视为一个路径名并测试它是否为一个存在的符号连接。 - ‘-x’(可执行)
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。 - ‘-F’(对子请求存在的文件)
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用! - ‘-U’(对子请求存在的URL)
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
3.还可以追加特殊的标记[flags]作为RewriteCond指令的第三个参数
[flags]是一个以逗号分隔的以下标记的列表:
- ‘nocase|NC’(忽略大小写)
它使测试忽略大小写,扩展后的TestString和CondPattern中’A-Z’ 和’a-z’是没有区别的。此标记仅用于TestString和CondPattern的比较,而对文件系统和子请求的检查不起作用。 - ‘ornext|OR’(或下一条件)
它以OR方式组合若干规则的条件,而不是隐含的AND。典型的例子如下:
RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*
RewriteRule ... 针对这3个主机的规则集 ...
如果不用这个标记,你就必须要书写三次条件/规则对。
作者: 石巍
原载: 金步国-Apache模块 mod_rewrite
版权所有,转载时必须以超链接形式注明作者和原始出处及本声明。