快捷搜索:  

ISAPI_Rewrite 3.1 教程中文版(3)

\E 结束引用运算符,终止一个由\Q开头的引用序列。

怎样得到匹配
正则表达式将匹配第一个可匹配字符串。如果从给定的起始处可以匹配到不止一个字符串,则它会匹配那个能匹配得最长的字符串。如果从同一个起始处有多个合适的匹配,而且每个匹配的长度都一样,则将选择那个第一子表达式匹配得最长的匹配。如果有两个以上的匹配字符串它们的第一子表达式匹配得一样长,则比较第二子表达式匹配的长度,如此类推。注意:ISAPI_Rewrite使用比封演算法。只有表达式匹配了整个顺序串才能得到匹配结果。例如:
• RewriteCond URL ^/somedir/.* #将匹配任何导向somedir目录以及它的子目录的请求,与此同时,
• RewriteCond URL ^/somedir/ #只匹配somedir根目录的请求。
对“病态”正则表达式的特别提示:
ISAPI_Rewrite 使用了一个非常强大的来自Boost库的正则表达式引擎。但是它依然有一些局限性:有着一些“病态”的表达式,它可能会指数级地消耗匹配时间。这些都涉及到嵌套重复运算符,例如试图对N个连续字母a匹配表达式“(a*a)*b”,消耗的时间将与N2成正比。这些表达式常常能改成另一种写法来避免这种问题。例如,“(a*a)*b”可以被改写成“a*b”,解析它消耗的时间与N成正比。在多数情况下,非嵌套重复表达式消耗的时间与N2成正比,但是,如果条款是相互排斥的,则它们会在线性时间里完成匹配。在“a*b”这种情况下,每个字符将要么匹配a要么匹配b或者不匹配。相较之下,“a*a”匹配器不能告知哪个分支被采取(第一个 a还是第二个a)因此必须尝试两种。
Regex可以检测出这种“病态”的正则表达式并终止和它们的匹配。这将使ISAPI_Rewrite的规则失效。当一个规则失效时,ISAPI_Rewrite将给客户端发送一个"Internal Server error - Rule Failed"的状态,以表示配置错误。

4.1AccessFileName指令

说明 设置分布式配置文件的名称
语法 AccessFileName filename [filename] ...
默认值 AccessFileName .htaccess
使用环境 server config

指定一个ISAPI_ReWrite寻求分布式配置的文件名列表。默认文件名是.htaccess。ISAPI_ReWrite只能载入它能在这个列表中找到的第一个文件。默认情况下ISAPI_ReWrite管理者会以hidden属性标记配置文件-它将防止文件被远程用户直接访问到。
如果配置文件进行了任何修改,它将在下次请求服务器时自动加载。

4.2AllowOverride指令

说明 明确规定了每个目录重写的基准URL。
语法 AllowOverride All|None|directive-type [directive-type] ...
默认值 AllowOverride All
使用环境 server config, virtual host, directory

这个指令声明了在分布式.htaccess文件里的指令是否可以覆盖父级别的httpd.conf中的指令。在ISAPI_Rewrite的使用环境中,这个指令实际上控制了特定虚拟主机或者目录的.htaccess文件的可用或者不可用。目前只支持三个值:AllNoneFileInfo
AllFileInfo使.htaccess文件以及它里面的整个ISAPI_Rewrite目录可用,None使所有的.htaccess文件以及目录不可用。这些目录具有继承性。这意味着如果你为一些目录或者虚拟主机指定AllowOverride none,.htaccess文件将对整个子目录树不可用。

4.4RewriteRule指令

说明 定义URL重写规则
语法 RewriteRule Pattern Substitution [flags]
使用环境 server config, virtual host, directory, .htaccess

这个指令定义了单个URL重写操作。它可能在一个配置文件中出现多次,每个实例定义一个重写URL的规则。RewriteRule指令包含URL匹配模式、替换字符串以及可选的标志设置。
Pattern(模式)是一个用来匹配当前URL的Perl兼容正则表达式。当前的URL可以是原来请求的URL或者已经由优先级高的规则替改过的URL。网址从不包含协议或者主机名,从第一个斜杠字符开始(只对httpd.conf文件适用)。而且当前网址还因不同的应用配置级别而异。对于目录级配置(.htaccess文件),结尾的斜线和配置文件的目录名,会在匹配时被从URL中忽略掉。在创建正则表达式时,请阅读这个文档的正则表达式语法部分来得到更多的信息。
"!"字符打头的模式将否定整个表达式。否定模式不能产生子匹配,所以你不能使用$N的替代引用。
Substitution(替换)字符串指定了模式是匹配时生成URL的格式字符串。除了纯文本,它可以包括这些特殊字符。
• 对Rewrite模式的回溯引用 $N
• 对Rewrite模式的回溯引用 %N
• 服务器变量 %{VARNAME}
• 条件格式模式 ?Ntrue_string:false_string
• 分组括号“(”和“)
替换字符串将所有的字符视为字面值,除了$'、'\'、'('、')','?',':'和'\'。为了字面化地读出特殊字符,它定义了用"\"引导的转义字符。下面的特殊字符是允许的。

$& 输出匹配的整个表达式。
$` 输出上一个的匹配结束到当前匹配的开始之间的文本(如果之前没有找到匹配串,则输出从开头到当前匹配的开始之间的文本)。
$' 输出当前匹配之后跟着的所有文字。
$$ 输出字面值$
\a 信号铃字符
\f 表单反馈字符
\n 新行字符
\r 回车符
\t 制表符
\v 垂直制表符
\x 十六进制字符,比如说\x0D.
\x{} 一个可能的Unicode十六进制字符-例如\x{1A0}
\cx ASCII的转义字符x,例如\c @等价于escape-@。
\e The ASCII 转义字符
\dd 八进制字符常量,例如\10。
\l 导致下一个字符被小写输出。
\u 导致下一个字符被大写输出。
\L 导致整个后继字符串被小写输出,直到遇到\E。
\U 导致整个后继字符串被大写输出,直到遇到\E。
\E 结束\L或者\U的后续字符串
\\ 单个反斜杠字符'\'

RewriteRule从父配置文件开始按照在配置文件中出现的次序应用。每个规则只有在它的Pattern匹配了一个URL而且所有连接条件(RewriteCond)都匹配时才会被应用。在该URL用Substitution完成替换之后,重写过程还在继续,一直到配置文件结束或者遇到一个用了任何停止标志的规则。在Substitution中的特殊字符串"-"(短横)意味着没有替换,而且当你需要应用该规则并留下的原始的未被染指过的URL时它是很有用的。
此外,这里有一个支持的flag(标志)列表。这些标识可以改变规则的表现。与Apache完全兼容的标志被标记为绿色,不支持的标志被标记为绿色,只在 ISAPI_Rewrite中被支持的标识被标记成黄色。
CU (Case Upper)
把替换字符串改成大写.
CL (Case Lower)
把替换字符串改成小写.
chain|C
将当前规则与后一条规则链接起来,后一条规则只有在当前规则被匹配的情况下才能被执行。链接可以再后续链接。
cookie|CO=NAME:VAL:domain[:lifetime[:path]]
设置一个有指定字段的cookies头,并把它和当前请求的响应一起发送到客户端。
env|E=VAR:VAL
不支持,在UNIX环境中设置一个环境变量,在Windows系统中无意义。
forbidden|F
发送即时403 FORBIDDEN响应到客户端,停止这个请求的规则处理以及所有其他的替换处理。
gone|G
发送一个即时401Gone响应到客户端,停止这个请求的规则处理以及所有其他的替换过程。
handler|H=Content-handler
不支持,为请求明确指定了处理处理。在IIS的世界中这是可以通过重写请求的文件扩展名来实现。但是没有从Apache处理到IIS文件扩展名的直接转换方法。
last|L
停止这里的重写处理,不再应用当前配置文件中的其它规则。在这种情况下,后代的.htaccess文件依然能被用到。
loop|LP
在一个循环中重复运行当前单个规则直到它的模式以及条件不再被匹配了。循环次数被限定为200免得陷入无限循环。
next|N
从当前配置文件开始处重复运行重写处理。循环次数被限定为200免得陷入无限循环。
nocase|NC
这个标记使Pattern大小写不敏感。
noescape|NE
不转义输出。在ISAPI_Rewrite默认情况下,在输出中会把所有的非ANSI字符编码为十六进制数%xx。
nosubreq|NS
这个标识在ISAPI_Rewrite中与在Apache中含义不同。精确的转换是不可能的,但这个标志可能仍然是有用的。每当配置文件处理完成之后,URL被重写了,ISAPI_Rewrite将启动这个新的URL处理过程(与Apache相同)使它可以应用到另一个配置文件中。此标识意思是该规则只针对初始用户的请求执行,不针对已被重写过的请求执行,以防可能出现的循环。ISAPI_Rewrite限定循环重复次数为10。
nounicode|NU
如果设置了NU标记,从Unicode转换为UTF - 8将不会发生。所有Unicode字符会保持它的%xx格式不变。
O (nOrmalize)
留着用于与ISAPI_Rewrite 2.x兼容。如果使用了RewriteCompatibility2,这个指令在处理之前将URL规范化。规范化包括移除一个URL编码、错误字符,等等。同时URL的规范化将完全移除它的查询字符串。如果RewriteCompatibility2 没有被使用,URL按照默认被规范化(就如同它在mod_rewrite中所做的),此标志的含义将反转。
proxy|P
将结果URL强制内部处理为另一台服务器上的目标,并即时传到远程服务器上,并且,规则处理在这里中断了。远程服务器的响应将被传递回客户端。proxy需要您指定完整的URL,由协议、主机名称等开头。ISAPI_Rewrite使用ISAPI扩展来处理代理请求。你可以在代理配置章节中阅读到更多有关于此的内 容。
passthrough|PT
不支持或者始终支持。在IIS中结果始终传递到下一个处理
qsappend|QSA
追加当前查找串的数据到替换串而不是由一个替换字符串取代它。当你需要在保留原来的参数再添加更多的查询字符串参数时,可以使用它。
redirect|R [=code]
强制服务器用重定向指令给客户端发送一个即时响应,提供一个新的接替位置。可以选加前缀http://thishost[:thissport]/从而把URL带到一个可用的绝对形式。如果没有给出代码,将使用一个302响应(暂时性移动)。你可以选择在3XX系列范围内指定任何代码。
skip|S=num
如果当前的规则匹配,强制rewrite引擎跳过后面num个规则。
type|T=MIME-type
强制目标文件的MIME类型转换成被设定的MIME类型。这能够被用来根据一些条件设置内容类型。
U (Unmangle log)
无损记录。记录它原来请求的网址,而不是被重写的URL。

4.5RewriteCond指令

说明 为以下的RewriteRule定义一个条件
语法 RewriteCond TestString CondPattern
使用环境 server config, virtual host, directory, .htaccess

该指令为后面的RewriteRule,RewriteHeader或RewriteProxy指令规定了一个条件。一个规则指令前可以有一个或多个条件,规则只有在所有条件得到满足的情况下才被应用。
TestString附加到纯文本可以包含下列结构。
• 用语法$N回溯引用RewriteRule模式
• 用语法%N回溯引用前面的RewriteCond模式
• 用语法${mapname:key|default}扩展RewriteMap
• 用语法%{HTTP:header}指代HTTP头值
• 用语法%{NAME_OF_VARIABLE}指代服务器变量
以下是可用的服务器变量列表:

HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT
REMOTE_ADDR
REMOTE_HOST
REMOTE_PORT
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE
DOCUMENT_ROOT
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
API_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
HTTPS
TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME
另外,所有的IIS特有的变量都是支持的。

CondPattern指定一个应用于TestString实例的正则表达式,以下特殊值也支持:
1.在正则表达式前头加“!”符号指明否定模式。
2.'<CondPattern'将CondPattern作为一个纯字符串按字典顺序比较,结果比较大
3.'>CondPattern'按字典顺序比较,结果比较小
4.'=CondPattern'按字典顺序比较,结果相等
5.'-d' 检测字符串是否存在目录。
6.'-f' 检测字符串是否存在文件。
7.'-s' 检测字符串是不是一个非零大小的文件。
8.'-l' (链接) 不支持的,始终为false。
9.'-x' (拥有可执行权限) 不支持的,始终为true。
10.'-F' (存在的文件,通过子请求) 不支持,和'–f'一样。
11.'-U' (存在的URL,通过子请求) 不支持的,始终为false。
下面的标记也是支持的:
'nocase|NC'
这个标记使模式大小写不敏感。
'ornext|OR'
这个标记用逻辑或而不是隐含的逻辑与结合子请求RewriteCond指令。
O
留用于ISAPI_Rewrite 2.x的兼容性。在处理前规范化字符串。规范化包括移除一个URL编码、错误字符,等等。同时URL的规范化将完全移除它的查询字符串。

4.6RewriteBase指令

说明 为每个目录的重写设置一个基准的URL
语法 RewriteBase URL-path
默认值 RewriteBase requested-directory-path
使用环境 directory, .htaccess

当RewriteRule指令用于每个目录的配置文件(.htaccess)时,它将自动从路径中剥去本地目录前缀,只对剩下的部分应用规则。RewriteBase指令允许你为这些规则精确指定一个基准。比如,哪部分要被剥离。
和Apache的mod_rewrite不同,ISAPI_Rewrite的访问不仅仅针对于物理路径,同时还针对于虚拟路径,而且可以自动地选择正确的基准。所以这个指令只是为了兼容性原因而被保留的。
URL-path可以是相对于根的路径也可以是空,空的URL-path意味着规则的基准等同于网站的根目录。

4.7RewriteProxy指令

说明 代理请求到一个远程服务器
语法 RewriteProxy Pattern Substitution [flags]
使用环境 server config, virtual host, directory, .htaccess

使结果URL被内部处理为另一台服务器上的目标,并即时传递到远程服务器,从此中断了规则处理。远程服务器的响应将被传递回客户端。代理要求您指定完整的URL,由协议,主机名称等开头。ISAPI_Rewrite使用ISAPI扩展来处理代理请求。你可以在配置代理的章节里阅读到更多。
语法和操作符与RewriteRule指令是相同的。但是RewroteProxy指令支持一些额外的标记。
H (preserve Host)
代理模块在连接远程服务器时将使用随着源请求一起发送过来的主机头,如果没有这个标志代理服务器则将用主机名和远程服务器的端口号组成主机头。
A (Add authentication headers)
允许从代理服务器将一个认证信息传递到局域网服务器上,当客户端认证和代理服务器冲突时它很有用。服务模块将对一个请求的服务器变量

AUTH_TYPE,
AUTH_USER,
LOGON_USER,
REMOTE_USER

追加相应的头

X-ISRW-Proxy-AUTH-TYPE,
X-ISRW-Proxy-AUTH-USER,
X-ISRW-Proxy-LOGON-USER,
X-ISRW-Proxy-REMOTE-USER

到被代理的服务器。
CR (use Credentials)
代理模块将尝试用在URL中指定的证书身份验证登录远程服务器,或者用基本身份验证头登录远程服务器。用了这个标志,你可以在一个替换字符串中使用http://user:password@host.com/page语法作为一个URL。

4.8RewriteHeader指令

说明 重写任何请求的HTTP头
语法 RewriteHeader HeaderName: Pattern Substitution [flags]
使用环境 server config, virtual host, directory, .htaccess

这个RewriteHeader指令是RewriteRule指令中的一个很常用的变量。而且它被设计用来重写客户端的URL部分以及HTTP头的部分。技术上的RewriteRule指令,相当于RewriteHeaderURL Pattern Substitution [flag]。这个指令可用于在IIS里更多应用程序的处理之前重写、创建或者删除任何客户端请求的HTTP头。
HeaderName:指定将被重写的HTTP头的名字。
patternSubstitutionflag与RewriteRule指令中都是相同的。

4.9RewriteMap指令

顶(0)
踩(1)

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

最新评论

  • ^
说明 为一个映射函数值定义一个键
语法 RewriteMap MapName MapType:MapSource