第 4 页 Apache下mod_rewrite的兼容性
3.2和Apache下mod_rewrite的兼容性
这个版本的ISAPI_Rewrite是为了最大程度上保持与Apache的mod_rewrite的兼容性。这个目标已经很大程度上实现了,尽管有一些功能无法执行,因为它们和Apeach以及UNIX结构高度绑定,而且它们在IIS上执行是不敏感的。举例说明:第H条:“强制内容处理”标记不能执行,因为在IIS中内容处理的范围依赖于扩展名。或者第[NS]条:“没有子请求”标记是无意义的,因为在IIS中是没有子请求的。
这里有一个完整的ISAPI_Rewrite和mod_rewrite兼容性图表。标记为绿色的功能或指令是充分支持的,黄色的功能是部分支持或计划在下一版本中支持,标示为红色的功能是不支持的。
· 兼容Perl的正则表达式 (plus extended syntax) · 服务器级httpd.conf配置· 虚拟网站.htaccess配置文件· 目录.htaccess配置文件· · · · · · · · AccessFileName · RewriteEngine · RewriteRule o $N 规则后向引用o %N RewriteCond 后向引用o ${mapname:key|default} o %{VARNAME} 服务器变量o '!' 取非o [C] 与下一个规则联锁o [CO=name:val:domain:lifetime:path] 设置cookie o [E=var:val] 设置环境变量o [F] 强制禁止应答o [G] 强制继续应答o [H=content-handler] 明确的内容处理 (不适用) o [L] 上一个规则标记o [N] 再次应用规则o [NC] 大小写不敏感o [NE] 不转义输出o [NS]非内部子请求o [P]代理通过o [PT] 传递通过下一个处理程序 (一直开启) o [QSA] 追加查询字符串o [R =code] 重定向o [S=num] 跳到下面第n条规则o [T=MIME-type] 强制明确应答 MIME 类型· RewriteCond o [NC] 大小写不敏感o [OR] 逻辑并集o %{HTTP:header} o '!' 非o '<CondPattern' 大于比较符o '>CondPattern' 小于比较符o '=CondPattern' 等于比较符o '-d' 目录存在o '-f' 文件存在o '-s' 非零文件o '-l' 符号链接o '-x' 有可执行权限的文件o '-F' 通过子请求文件存在o '-U' 通过子请求URL存在· RewriteBase · RewriteMap o txt: 文本映射o rnd: 随机映射o int: 内部函数 toupper, tolower, escape, unescape o prg: 外部程序o dbm: 散列文件· RewriteLog · RewriteLogLevel · RewriteOptions · RewriteLock · AllowOverride 3.3使用环境以及处理顺序以下是这个程序文档中要被用到的使用环境的详解:
server config这个标志表示该指令可以用在全局httpd.conf配置文件中,但是不能用在任何一个分区(例如
或者)内部。它不允许放在.htaccess文件中。
vitrual host
这意味着指令可以出现在容器内。
directory
这个标志表示指令在、、容器内可用,而且它们的正则表达式是等价的。
.htaccess
使用环境标为它的指令可以出现在每个目录的.htaccess文件中。记住当RewriteRule指令用在.htaccess配置文件中时,它将自动从路径中剥去本地目录前缀,只对剩下的部分应用规则。你可以使用RewriteBase指令显式地给这些规则指定一个基本路径。
应用次序
当同一分区内的多条指令同时适用时,理解每个分区应用的次序是很重要的,因为它会对最终效果起作用。应用次序如下所述:
1.(正则表达式除外):多个分区可以应用于单个请求,如果多个(非正则表达式)分区匹配了包含文档的这个目录(或者它的上级目录中的一个),则按照从短到长的匹配次序应用指令。
2..htaccess文件按父目录到子目录的顺序应用。
3.和同时被执行。
4.和也同时被执行。
先应用虚拟主机外面定义的相应分区和指令,再应用分区中的分区和指令。同一时间只有一个分区可以应用给请求。较晚的分区优先于较早的那些。
3.4正则表达式
正则表达式语法指南是Rege++文档的一部分,由John Maddock博士友情提供,Copyright ?1998-2004,包含在《Boost license》这本书里。完整的语法说明可以在《Boost.Regex documentation》中找到。
字面值
所的字符都是字面值,除了“.”“*”“?”“+”“(”“)”“{”“}”“[”“]”“^”和“$”。当这些字符由“\”前导时也是字面值。一个字面值是个匹配它自己的字符。
通配符
点字符“.”匹配空字符和换行符以外的任何单个字符。
重复
重复是被重复任意次数的表达式。一个表达式跟着“*”可以被重复任意次数,包括重复零次。一个表达式跟着“+”可以被重复任意次数,但是至少重复一次。一个表达式跟着“?”可以被只重复零次或者一次。当需要明确指定重复的最低次数和最高次数时,可以用限定运算符“{}”。这样“a{2}”是字母“a”重复两次。“a{2,4}”表示字母“a”重复2到4次。“a{2,}”表示字母“a”重复2到无限多次。注意“{}”里面必须没有空格。而且它没有对上限值和下限值限定范围。所有的重复表达式参考尽可能短的前子表达式:一个单独字符,一个字符集,或者一个用“()”括起来的子表达式,举几个例子:
? "ba*"匹配所有的"b","ba","baaa" 等等。
? "ba+"匹配"ba"或"baaa",但是不匹配"b"。
? "ba?"匹配"b"或者"ba"。
? "ba{2,4}"匹配"baa","baaa","baaaa"。
懒惰型重复
在重复之后附加一个“?”就是懒惰型的重复了。一个懒惰型的重复是指匹配尽可能短的字符串。
例如:匹配HTML标记对可以使用下面这样的正则表达式:
"<\s*tagname[^>]*>(.*?)<\s*/tagname\s*>"
在这种情况下$1将包含标签对之间的文本,而且是最短的匹配字符串。
插入成份
插入成分有两个用处——把项目编组到子表达式中,并且对生成的匹配标号。例如,表达式"(ab)*"将匹配所有的这类字符串"ababab"。所有的被插入成份标号的子匹配将可以用\N或者$N语法来回溯引用到。它允许子表达式匹配空字符串,子表达式以1为开始从左往右编号。子表达式0就是整个表达式。