二 URL重写中的RewriteCond和RewriteRule指令详解

根据你的需要遵循以下原则: 如果你使用了有CGI脚本的URL前缀,以强制它们由CGI脚本处理, 而对子请求处理的出错率(或者开销)很高,在这种情况下,可以使用这个标记 。
"nocase|NC" (忽略大小写 no case)
它使Pattern忽略大小写,即, 在Pattern与当前URL匹配时,"A-Z" 和"a-z"没有区别 。
"qsappend|QSA" (追加请求串 query string append)
此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换 。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记 。
"noescape|NE" (在输出中不对URI作转义 no URI escaping)
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则 。一般情况下,特殊字符(如"%", "$", ";"等)会被转义为等值的十六进制编码 。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,如:
RewriteRule /foo/(.*) /bar?arg=P1=$1 [R,NE]
可以使"/foo/zed"转向到一个安全的请求"/bar?arg=P1=zed".
"passthrough|PT" (移交给下一个处理器 pass through)
此标记强制重写引擎将内部结构request_rec中的uri字段设置为 filename字段的值,它只是一个小修改,使之能对来自其他URI到文件名翻译器的 Alias,ScriptAlias, Redirect 等指令的输出进行后续处理 。举一个能说明其含义的例子: 如果要通过mod_rewrite的重写引擎重写/abc为/def,然后通过mod_alias使/def转变为/ghi,可以这样:
RewriteRule ^/abc(.*) /def$1 [PT]
Alias /def /ghi
如果省略了PT标记,虽然mod_rewrite运作正常, 即, 作为一个使用API的URI到文件名翻译器, 它可以重写uri=/abc/…为filename=/def/…, 但是,后续的mod_alias在试图作URI到文件名的翻译时,则会失效 。
注意: 如果需要混合使用不同的包含URI到文件名翻译器的模块时, 就必须使用这个标记 。。混合使用mod_alias和mod_rewrite就是个典型的例子 。
【二 URL重写中的RewriteCond和RewriteRule指令详解】For Apache hackers
如果当前Apache API除了URI到文件名hook之外,还有一个文件名到文件名的hook, 就不需要这个标记了! 但是,如果没有这样一个hook,则此标记是唯一的解决方案 。Apache Group讨论过这个问题,并在Apache 2.0 版本中会增加这样一个hook 。
"skip|S=num" (跳过后继的规则 skip)
此标记强制重写引擎跳过当前匹配规则后继的num个规则 。它可以实现一个伪if-then-else的构造: 最后一个规则是then从句,而被跳过的skip=N个规则是else从句. (它和"chain|C"标记是不同的!)
"env|E=VAR:VAL" (设置环境变量 environment variable)
此标记使环境变量VAR的值为VAL, VAL可以包含可扩展的反向引用的正则表达式$N和%N 。此标记可以多次使用以设置多个变量 。这些变量可以在其后许多情况下被间接引用,但通常是在XSSI (via );or;CGI (如 $ENV{"VAR"})中, 也可以在后继的RewriteCond指令的pattern中通过%{ENV:VAR}作引用 。使用它可以从URL中剥离并记住一些信息 。
"cookie|CO=NAME:VAL:domain[:lifetime[:path]]" (设置cookie)
它在客户端浏览器上设置一个cookie 。cookie的名称是NAME,其值是VAL 。domain字段是该cookie的域,比如".apache.org", 可选的lifetime是cookie生命期的分钟数, 可选的path是cookie的路径 。

    推荐阅读