快捷搜索:   nginx

Apache RewriteRule的标志一览

1) R[=code](force redirect) 强制外部重定向
   强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。
2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。
3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
4) P(force proxy) 强制使用代理转发。
5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
6) N(next round) 重新从第一条规则开始运行重写过程。
7) C(chained with next rule) 与下一条规则关联
   如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。
8) T=MIME-type(force MIME type) 强制MIME类型
9) NS (used only if no internal sub-request) 只用于不是内部子请求
10) NC(no case) 不区分大小写
11) QSA(query string append) 追加请求字符串
12) NE(no URI escaping of output) 不在输出转义特殊字符
    例如:RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed
13) PT(pass through to next handler) 传递给下一个处理
    例如:
       RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理
       Alias /def /ghi
14) S=num(skip next rule(s)) 跳过num条规则
15) E=VAR:VAL(set environment variable) 设置环境变量

-------------------------------------------------------------------------------------------

RewriteRule相关规范摘要

RewriteRule 指令

说明 为重写引擎定义重写规则 语法 RewriteRule Pattern Substitution [flags] 作用域 server config, virtual host, directory, .htaccess 覆盖项 FileInfo 状态 扩展(E) 模块 mod_rewrite 兼容性 cookie-flag在Apache 2.0.40及以后的版本中可用

RewriteRule指令是重写引擎的根本。此指令可以多次使用。每个指令定义一个简单的重写规则。这些规则的定义顺序尤为重要——在运行时,规则是按这个顺序逐一生效的。

Pattern是一个作用于当前URL的perl兼容的正则表达式。"当前URL"是指该规则生效时刻的URL的值。它可能与被请求的URL截然不同,因为其他规则可能在此之前已经发生匹配并对它做了改动。

正则表达式的一些用法示例:

文本
. 任意一个单字符
[chars] 字符类: "chars"中的任意一个字符
[^chars] 字符类: 不在"chars"中的字符
text1|text2 选择: text1 或 text2

量词
? 前面的字符出现 0 或 1 次
* 前面的字符出现 0 或 N 次(N > 0)
+ 前面的字符出现 1 或 N 次(N > 1)

分组
(text) text 组
(常用于设置一个选择的边界,或用于生成后引用:
在RewriteRule中可以用 $N 引用第N个分组)


^ 锚定到行首
$ 锚定到行尾

转义
\c 对给定的字符c进行转义
(比如对".[]()"进行转义,等等)

更多有关正则表达式的资料请参见perl正则表达式手册页("perldoc perlre")。另外,在mod_rewrite中,还可以使用否字符('!')前缀实现反转。比如:"如果当前URL与模式相匹配"它用于使用否定式匹配模式较容易描述的某些情况,或者作为最后一条规则。

注意

使用否字符以反转匹配模式时,匹配模式中不能使用分组的通配成分。由于模式不匹配而使分组的内容是空的,所以它是不可能实现的。 因此,如果使用了否定式匹配模式,那么后继的字符串中就不能使用$N

重写规则中的Substitution是当原始URL与Pattern相匹配时,用来替代(或替换)的字符串。除了纯文本,还可以包含:

  1. Pattern的反向引用($N)
  2. 对最后匹配的RewriteCond的反向引用(%N)
  3. 规则条件测试字符串(%{VARNAME})中的服务器变量
  4. 映射函数调用(${mapname:key|default})

反向引用的$N(N=0..9)是指用Pattern匹配的第N组的内容去替换URL。服务器变量与RewriteCond指令的TestString相同。映射函数由RewriteMap指令决定,其说明也参见该指令。这三种类型变量按上面列表中的顺序被展开。

如上所述,所有的重写规则都是按配置文件中的定义顺序作用于Substitution的。URL被Substitution完全替换,并继续处理直到所有规则处理完毕,除非用L标记显式地终结(见下文)。

'-'是一个特殊的替换串,意思是不替换。它可以用于仅仅匹配某些URL而无须替换的情况,比如,在发生替换前,允许以C(chain)标记连接的多个匹配模式同时起作用。

此外,在Substitution之后还可以追加[flags]标记作为RewriteRule指令的第三个参数。Flags是一个包含以逗号分隔的下列标记的列表:

  • 'chain|C'(链接下一规则)
    此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则被匹配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除".www"(此处不应该出现".www")。
  • 'cookie|CO=NAME:VAL:domain[:lifetime[:path]]'(设置cookie)
    在客户端设置一个cookie。cookie的名称是NAME,值是VALdomain是该cookie的域,比如'.apache.org',可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。
  • 'env|E=VAR:VAL'(设置环境变量)
    此标记将环境变量VAR的值为VALVAL可以包含可扩展的正则表达式反向引用($N%N)。此标记可以多次使用以设置多个变量。这些变量可以在其后许多情况下被间接引用,通常是在XSSI(<!--#echo var="VAR"-->)或CGI($ENV{'VAR'})中,也可以在后继的RewriteCond指令的CondPattern参数中通过%{ENV:VAR}引用。使用它可以记住从URL中剥离的信息。
  • 'forbidden|F'(强制禁止URL)
    强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。
  • 'gone|G'(强制废弃URL)
    强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。
  • 'handler|H=Content-handler'(强制指定内容处理器)
    强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由"cgi-script"处理器处理。
  • 'last|L'(结尾规则)
    立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL('/')为实际存在的URL(比如:'/e/www/')。
  • 'next|N'(从头再来)
    重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
  • 'nocase|NC'(忽略大小写)
    它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,'A-Z'和'a-z'没有区别。
  • 'noescape|NE'(在输出中不对URI进行转义)
    此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符('%', '$', ';'等)会被转义为等值的十六进制编码('%25', '%24', '%3B'等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:

    RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]

    可以使'/foo/zed转向到一个安全的请求'/bar?arg=P1=zed'。
  • 'nosubreq|NS'(不对内部子请求进行处理)
    在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx)时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除某些规则。
    使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
  • 'proxy|P'(强制为代理)
    此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。

    注意:要使用这个功能,必须已经启用了mod_proxy模块。

  • 'passthrough|PT'(移交给下一个处理器)
    此标记强制重写引擎将内部request_rec结构中的uri字段设置为filename字段的值,这个小小的修改使得RewriteRule指令的输出能够被(从URI转换到文件名的)Alias, ScriptAlias, Redirect等指令进行后续处理[原文:This flag is just a hack to enable post-processing of the output of RewriteRule directives, using Alias, ScriptAlias, Redirect, and other directives from various URI-to-filename translators.]。举一个能说明其含义的例子: 如果要将
顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论