#########################################################
#301rewrite杂谈
#date:2011-08-08
#作者:Jeacen
#QQ:198888885 MAIL:jeacen@lamphelp.org
#blog: http://jeacen.blog.51cto.com
#psite: http://www.lamphelp.org
#pblog:http://www.jeacen.com
##########################################################
#########################################################
########################################################
#######################################################
RewriteRule指令
说明: 为重写引擎定义规则
语法: RewriteRule Pattern Substitution
RewriteRule指令是重写引擎的根本.此指令可以多次使用. 每个指令定义一个简单的重写规则.这些规则的定义顺序尤为重要, ,在运行时刻,规则是按这个顺序逐一生效的.
Pattern是一个作用于当前URL的兼容perl的正则表达式. 这里的``当前''''是指该规则生效时的URL的值. 它可能与被请求的URL不同,其他规则可能在此之前已经发生匹配并对它做了改动.
正则表达式的一些用法:
Text:
. Any single character
[chars] Character class: One of chars
[^chars] Character class: None of chars
text1|text2 Alternative: text1 or text2
Quantifiers:
? 0 or 1 of the preceding text
* 0 or N of the preceding text (N > 0)
1 or N of the preceding text (N > 1)
Grouping:
(text) Grouping of text
(either to set the borders of an alternative or
for making backreferences where the Nth group can
be used on the RHS of a RewriteRule with $N)
Anchors:
^ Start of line anchor
$ End of line anchor
Escaping:
\char escape that particular char
(for instance to specify the chars ".[]()" etc.)
更多有关正则表达式的资料请参见perl正则表达式手册.
另外,在mod_rewrite中,还可以使用否字符(''!'')的pattern前缀,以实现pattern的反转. 比如:``如果当前URL不与pattern相匹配''''. 它用于使用否pattern较容易描述的需要排除的某些情况,或者作为一条规则.
注意
使用否字符以反转pattern时,pattern中不能使用分组的通配成分. pattern不匹配而使分组的内容是空的,它是不可能实现的. 因此,如果使用了否pattern,那么后继的字符串中就不能使用$N!
重写规则中的Substitution是, 当原始URL与Pattern相匹配时,用以替代(或替换)的字符串. 除了纯文本,还可以使用
$N 反向引用RewriteRule的pattern
%N 反向引用匹配的RewriteCond pattern
规则条件测试字符串中(%{VARNAME})的服务器变量
映射函数调用(${mapname:key|default})
反向引用的$N (N=0..9) 是指用Pattern所匹配的第N组的内容去替换URL. 服务器变量与RewriteCond指令的TestString相同. 映射函数由RewriteMap指令所决定,其说明也参见该指令. 这三种类型变量按上面列表中的顺序被扩展.
如上所述,所有的重写规则都是(按配置文件中的定义顺序)作用于Substitution的. URL被Substitution完全地替换,并继续处理直到所有规则处理完毕, 除非用L标记显式地终结 - 见下文.
''-''是一个特殊的替换串,意思是不要替换! 似乎很愚蠢吧? 不, 它可以用于仅仅匹配某些URL而无须替换的情况下,即, 在发生替换前,允许以C (chain)标记连接的多个pattern同时起作用.
还有,你甚至可以在替换字符 |