ISAPI_Rewrite3使用教程(二)

By | 2013年12月27日

ISAPI_Rewrite3使用教程(二)

插入成份
插入成分有两个用处――把项目编组到子表达式中,并且对生成的匹配标号。例如,表达式”(ab)*”将匹配所有的这类字符串”ababab”。所有的被插入成份标号的子匹配将可以用\N或者$N语法来回溯引用到。它允许子表达式匹配空字符串,子表达式以1为开始从左往右编号。子表达式0就是整个表达式。

正则表达式

无标记插入

有时候你需要把子表达式编组为插入成份,但是不想为这个插入成分而吐出另一个标记的子表达式。在这种情况下,一个非标记插入(?:expression)可能有用。
例如,下例表达式可以创建一个非子表达式:
“(?:abc)*”

N择1标记
当表达式可以匹配一个子表达式或另一个的时候,N择1标记起作用了。每个N择1可以用|隔开。每个N择1标记是一个最大可能性前缀子表达式,它是和重复操作符相反的行为。
示例:
“a(b|c)”匹配”ab”或”ac”
“abc|def”匹配”abc”或”def”

预置符
一个预置符是一个可以匹配所有作为预置成员的单个字符的预置。预置字符用方括号“[”和“]”括起来,可以容纳字面值、字符序列、字符类、经整理过的对象以及等价的类。用^打头的预置声明可以排除包含的内容。
示例:
字面值
“[abc]”匹配”a”或”b”或”b”。
“[^abc]”匹配”a”和”b”和”c”之外的所有字符。

字符序列
“[a-z]”匹配所有的从”a”到”z”的字符
“[^A-Z]”匹配所有的字符除了从”A”到”Z”的这些字符。

字符类
字符类用语法”[:classname:]”来表示,classname是声明过的预设值中的一个。例如:”[[:space:]]”是所有的空白占位符的预设。下表中的字符类是可用的:

alnum 所有的alpha数字字母
alpha 字母表字符[a-zA-Z]。其它字符也可以包含在内,这取决于本地环境
blank 所有的空白字符,包含回车或者空格
cntrl 所有的控制字符
digit 从0到9的数字
graph 所有的图画字符
lower 所有的小写字母[a-z],其它的字符也可以包含在内,这取决于本地环境
print 所有的印刷字符
punct 所有的标点符号
space 所有的空白占位符
upper 所有的大写字母[A-Z],其它的字符也可以包含在内,这取决于本地环境
xdigit 所有的16进字字符0~9,A-F
word 所有的词汇字符,包括字母数字外加underscore
unicode 所有的编码大于255的字符,这只对大范围字符特征类生效

这里有一些缩写法可以代替以上字符类:
\w 代替 [:word:]
\s 代替 [:space:]
\d 代替 [:digit:]
\l 代替 [:lower:]
\u 代替 [:upper:]

 

正则表达式

集合元素
集合元素一般采用预置声明内加[.tagname.]的格式。其中tagname既可以是一个单个字符,也可以是一个集合元素名。例如:[[.a.]]等价于[a],[[.comma.]]等价于[,]。ISAPI_Rewrite支持所有的标准POSIX集合元素名,以及下面的这些字符组合:“ae”、“ch”、“ll”、“ss”、“nj”、“dz”、“lj”、任意小写、大写、首字母大写的变化组合。多个字符集合元素可以导致预置匹配一个以上的字符。例如:[[.ae.]]将匹配两个字符,但是[^[.ae.]]只会匹配一个字符。
等价类
等价类一般采用预置声明内加[=tagname=]的格式,其中tagname既可以是单个字符,也可以是一个集合元素的名称,它能匹配同样的主要等价类成员的字符,就跟集合元素[.tagname.]一样。一个等级类是一个相同整理的字符预设,但主要是一个等价类的字符集,其主要排序关键字都是一样的(例如,字符串通常先依字符整理,然后根据重音,然后根据大小写。主要排序键与字符相关,次要与重音相关,再次与大小写相关。如果没有等价类符合tagname,则[=tagname=]是与[.tagname.]完全一样的。
Equivalence classes take the general form [=tagname=] inside a set declaration, where tagname is either a single character, or a name of a collating element, and matches any character that is a member of the same primary equivalence class as the collating element [.tagname.]. An equivalence class is a set of characters that collate the same, a primary equivalence class is a set of characters whose primary sort key are all the same (for example strings are typically collated by character, then by accent, and then by case; the primary sort key then relates to the character, the secondary to the accentation, and the tertiary to the case). If there is no equivalence class corresponding to tagname, then [=tagname=] is exactly the same as [.tagname.].
要在一个预设中包含字面值“-”,请这样做:使它成为开放的“[”或者“[^”后面的第一个字符、一个系列或者一个集合元素的末点,或者用一个前置的转义字符如“[\-]”。要在一个预设中包含一个字面值“[”或者“]”或者“^”,请把它们作为一个系列或者一个集合元素的末点,或者用一个前置的转义字符。
行锚
锚用来匹配一行开头或结尾的空串。“^”匹配行开头的空串,“$”匹配行结尾的空串。
回溯引用
回溯引用是引用前面已经被匹配的子表达式。这个引用是被匹配的子表达式,而不是表达式本身。回溯引用包括转义字符“\”跟着一个从1到9的数字。“\1”引用第一个子表达式,“\2”引用第二个,依次类推。举个例子,表达式“(.*)\1”匹配任何关于它的中点重复的字符串,比如说“abcabc”或者“xyzxyz”。一个对子表达式的回溯引用不参加任何匹配,匹配空字符串。在ISAPI_Rewrite中,所有的回溯引用是对整个RewriteRule和相应的RewriteCond指令是全局性相关的。RewriteRule指令中如果有RewirteCond子令的话,子匹配从相应的RewriteRule指令的第一个RewriteCond指令开始从上到下从左往右编号。
向前查找
向前查找有两种形式:正向前查找和负向前查找。
? “(?=abc)”匹配跟在表达式”abc”后面的零字符。
? “(?!abc)”匹配不跟在表达式”abc”后面的零字符。
通配符
下面的运算符提供了与GNU正则表达式库的兼容性。
? “\w”匹配任意单个组词字符,它等价于表达式“[[:word:]]”。
? “\W”匹配任意一个非组词字符,它等价于表达式“[^[:word:]]”。
? “\<“匹配词头空字符串。
? “\>”匹配词尾空字符串。
? “\b”匹配词头或者词尾空字符串。
? “\B”匹配词语中的空字符串。
转义字符
转义字符“\”含有多重意义:
? 转义字符可以引导一个运算符,例如:回溯引用、词操作符
? 转义字符可以使下面的字符正常,比如说“\*”代表一个字面值“*”,而不是重复运算符。

单个字符转义序列
下面的转义序列是单个字符的别名:

转义序列 字符代码 含义
\a 0x07 信号铃记号.
\t 0x09 制表符
\v 0x0B 垂直制表符
\e 0x1B ASCII转义字符
\0dd 0dd 八进制字符代码,其中dd是一个或多个八进制数字。
\xXX 0xXX 十六进制字符代码,其中XX是一个或多个八进制数字。
\x{XX} 0xXX 十六进制字符代码,其中XX是一个或更多十六进制数字,可选用Unicode字符。
\cZ z-@ ASCII转义序列control-Z,其中Z是任意一个编码大于或等于“@”的编码的ASCII字符。

杂项转义序列
以下提供perl的大部分兼容性,但是在\l、\L、\u和\U上有一些区别

转义序列 含义
\w 等价于 [[:word:]].
\W 等价于[^[:word:]].
\s 等价于[[:space:]]。
\S 等价于[^[:space:]]。
\d 等价于[[:digit:]]。
\D 等价于[^[:digit:]]。
\l 等价于[[:lower:]]。
\L 等价于[^[:lower:]]。
\u 等价于[[:upper:]]。
\U 等价于[^[:upper:]]。
\C 任何单个字符,等价于“.”
\X 匹配任何Unicode组合字符序列,例如“a\x0301”(字符a和一个尖角)
\Q 开始引号运算符。后面跟前的所有的内容都被当作字面值,直到发现一个\E结束运算符。
\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.2 ? ? ? AllowOverride指令

说明 明确规定了每个目录重写的基准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.3 ? ?RewriteRule指令

说明 定义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完全兼容的标志被标记为绿色,部分兼容或下一版计划兼容的黄色,不兼容的标记为红色。

 

  • RewriteRule
    • $N rule backreferences
    • %N RewriteCond backreferences
    • ${mapname:key|default}
    • %{VARNAME} server variables
    • ‘!’ negation
    • [C] chain with next rule
    • [CO=name:val:domain:lifetime:path] set cookie
    • [E=var:val] set environment variable
    • [F] force forbidden response
    • [G] force gone response
    • [H=content-handler] explicit content handler (unapplicable)
    • [L] last rule flag
    • [N] apply rules again
    • [NC] ignore case
    • [NE] don’t escape output
    • [NS] no internal subrequest
    • [P] proxy pass
    • [PT] pass through the next handler (always on)
    • [QSA] append query string
    • [R =code] redirect
    • [S=num] skip next?n?rules
    • [T=MIME-type] force explicit response MIME type
  • RewriteCond
    • [NC] ignore case
    • [OR] logical or combining
    • %{HTTP:header}
    • ‘!’ negation
    • ‘<CondPattern’ more than comparison
    • ‘>CondPattern’ less then comparison
    • ‘=CondPattern’ equal to comparison
    • ‘-d’ directory exist
    • ‘-f’ file exist
    • ‘-s’ non zero file
    • ‘-l’ symbolic link
    • ‘-x’ file with executable permissions
    • ‘-F’ file exist via subrequest
    • ‘-U’ URL exist via subrequest

4.4RewriteCond指令

说明 为以下的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’?(存在的文件,通过子请求) 不支持,和’?Cf’一样。
11.’-U’ (存在的URL,通过子请求) 不支持的,始终为false。

下面的标记也是支持的:
‘nocase|NC’
这个标记使模式大小写不敏感。
‘ornext|OR’?
这个标记用逻辑或而不是隐含的逻辑与结合子请求RewriteCond指令。
O
留用于ISAPI_Rewrite 2.x的兼容性。在处理前规范化字符串。规范化包括移除一个URL编码、错误字符,等等。同时URL的规范化将完全移除它的查询字符串。

4.5RewriteBase指令

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

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

4.6?? RewriteProxy指令

说明 代理请求到一个远程服务器
语法 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:[email protected]/page语法作为一个URL。

4.7?? RewriteHeader指令

说明 重写任何请求的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.8? RewriteMap指令

说明 为一个映射函数值定义一个键
语法 RewriteMap?MapName MapType:MapSource
使用环境 server config, virtual host, directory, .htaccess

RewriteMap指令被用来定义一个键到值的查找功能。当你需要映射大量的值时,它会很有用的,而且它的速度远远快过用规则匹配来做到它。映射功能的性能受映射文件的大小影响微乎其微。有三种类型的映射:
??txt:用一个文本文件映射
??rnd:从多个可选项中产生随机值
??int:内部函数
MapName是这个映射功能的名字,在RewriteRule命令中被用来指定这个映射。请确保每个映射用唯一的名称定义。你可以使用以下语法在RewriteRule指令的Substitution参数中调用映射功能

${ MapName : LookupKey | DefaultValue }

如果这个结构是在Substitution中出现,ISAPI_Rewrite将在映射中查找这个键,万一找到了一个,就用它的值替换这个结构。如果什么值也没有被找到,将用可选的DefaultValue。如果没有指定DefaultValue,它将用一个空串替换。
下面的标志也是支持的:
‘nocase|NC’
这个标志使该查找键大小写不敏感。
下面是一个大小写不敏感映射文件指令的示例

RewriteMap examplemap txt:C:/path/to/file/map.txt [NC]

MapSource文件的路径,既可以是绝对地址也可以是相对地址。相对地址将被从当前配置的文件夹开始推算,换言之,就是从这个定义映射的配置文件的路径开始推算。
然后你可以在RewriteRule中如下使用这个映射:

RewriteRule ^/ex/(.*) ${examplemap:$1}

下列MapTypeMapSource的组合是可用的:
txt:纯文本映射,它的source是到一个可用的文本文档的windows文件系统路径。文本文档必须是如下格式的:

#This is a commentkey1 value1 #Another commentkey2 value2keyN valueN

rnd:随机查找多个值。Source是一个文本文档的路径,文本文档必须是以下格式:

#This is a commentkey1 value1|value2|value3key2 value4|value5|value6|valueN

int:?调用内部函数。 Source必须是下列预定义的内部函数之一:
??toupper:?转换关键词为大写形式。
??tolower:转换关键词为小写形式。
??escape:把特定字符编码为十六进制。
??unescape:把十六进制值编译为特定字符。

4.9?? RewriteLog指令

说明 设置ISAPI_Rewrite日志文件的名称
语法 RewriteLog?file-path
默认值 RewriteLog?installdir\rewrite.log
使用环境 server config

这个指令用来设定记录ISAPI_Rewrite动作的日志文件的文件名。示例:

Rewritelog "C:\local\path\rewrite.log"

4.10?? RewriteLogLevel指令

说明 设置日志级别
语法 RewriteLogLevel?Level
默认值 RewriteLogLevel 0
使用环境 server config

这个指令设置日志的输出长度。默认值0表示不记日志,而最大的级别9则表示所有的动作都要记录。
使用使用较高的级别值可能会降低ISAPI_Rewrite的操作速度。我们建议你当你完成规则调试之后,通过设置日志级别为零来禁用日志。

4.11?? RewriteOptions指令

说明 指定特殊选项
语法 RewriteOptions Options
使用环境 server config, virtual host, directory, .htaccess

这个指令可以为ISAPI_Rewrite设置特定选项。当前只有惟一一个选项可用:inherit
inherit:强迫当前配置从父级继承所有的选项和规则。这意味着来自父级配置的所有的规则将被再次执行,除非当前环境另有相应重写规则。

4.12?? RewriteCompatibility2指令

说明 启用或禁用ISAPI_Rewrite 2.x兼容模式
语法 RewriteCompatibility2?on|off
默认值 RewriteCompatibility2 off
使用环境 server config, virtual host, directory, .htaccess

这一指令将激活与ISAPI_Rewrite 2.x版的兼容性,将一些2.X的规则正确地翻译为3.0版本的语法。这并不意味着ISAPI_Rewrite 3将开始懂得不经修改旧的语法。如果您有针对ISAPI_Rewrite 2.X的旧设计请使用ISAPI_Rewrite提供的翻译工具将这些旧规则转化为新的语法规则。
现在通过设置指令RewriteCompatibility2唯一改变的是,它将关闭网址常规前缀并删除查询字符串。 Apache的mod_rewrite将删除匹配的URL的查询字符串的这部分,相较之下ISAPI_Rewrite 2.X将匹配整个网址(包括查询字符串在内),而且[O]标记的意思将由该指令倒置。

4.13ErrorLog指令

说明 一般的错误文件的位置
语法 ErrorLog?file-path
默认值 ErrorLog?installdir\rewrite.log
使用环境 server config

这个指令设置存放ISAPI_Rewrite整体错误和消息的日志文件的名称。例如httpd.conf file load, .htaccess file load,等等
例:ErrorLog “C:local\path\error.log”

4.14?? LogLevel指令

说明 设置一般的错误的日志级别
语法 LogLevel?Level
默认 LogLevel?warn
使用环境 server config

这个指令设置一般日志的输出长度,跟它的重写过程无关。这里有一个level的可用值列表:emerg、alert、crit、error、warm、notice、info、debug。当前的ISAPI_Rewrite日志只记录错误信息。
设置LogLevel调试来解决配置文件中加载的问题。

4.15??指令

说明 把应用于特定IP地或者主机的指令编组
语法 <VirtualHost addr[:port] [addr[:port]] …> …
使用环境 server config

…?标签用来对应用到特定虚拟主机里的指令进行分组。
addr的可用值为:
? 特定的IP地址
? 完整的域名
? 字符’*’可以匹配任何主机或者特定服务器的任何端口号。
例如:

RewriteEngine offAllowOverride none<VirtualHost onesite.com www.onesite.com>RewriteEngine onAllowOverride all

不要忘了在每个标签中包含RewriteEngine on指令,也不要将不能应用的规则封装进去。

4.16?指令

说明 将适用于特定的文件系统的目录和子目录的指令编组
语法
使用环境 server config, virtual host

…?标签被用来对应用到特定文件系统目录以及子目录的指令进行分组。通配符?和*是可用的。正则表达式也是可用的,需要以~字符打头。
对目录路径参数必须小心:它们必须字面匹配用来访问文件的文件系统路径,用于某一特定的指令并不适用于来自同一目录下通过不同的路径的文件访问,例如通过不同的符号链接。只有完整的文件路径是被允许使用的。
示例:

<Directory C:/inetpub/>  AllowOverride None<Directory C:/inetpub/home/>  AllowOverride FileInfo<Directory ~ "C:/inetpub/wwwroot/.*/[0-9]{3}">  # ... directives here ...

不要忘了在每个标签中包含RewriteEngine on指令,也不要将不能应用的规则封装进去。

4.17指令

说明 将适用于特定的文件系统的目录和子目录的指令编组
语法
使用环境 server config, virtual host

…?被用来封装一个只适用于指定的文件系统的目录和子目录的指令组。这个指令和<Directory ~> 语法相同。
示例:

<DirectoryMatch "^/www/(.+/)?[0-9]{3}">   # ... directives here ...

不要忘了在每个< DirectoryMatch>标签中包含?RewriteEngine on指令,也不要将不能应用的规则封装进去。

4.18?指令

说明 将应用于匹配文件名的指令包装起来
语法 <Files?filename> …
使用环境 server config, virtual host, directory, .htaccess

指令以文件名限定了封装的指令的作用域。filename参数必须包含一个文件名,支持?和*以及以~字符打头的正则表达式。
示例:

<Files index.*>   # ... directives here ... <Files ~ "\.(gif|jpe?g|png)$">   # ... directives here ...

不要忘了在每个标签中包含RewriteEngine on指令,也不要将不能应用的规则封装进去。

4.19??指令

说明 将应用于匹配文件名的指令包装起来
语法 <FilesMatch?regex> …
使用环境 server config, virtual host, directory, .htaccess

指令的语法和_指令”><Files ~>语法完全一样。

<FilesMatch "\.(gif|jpe?g|png)$">

不要忘了在每个标签中包含RewriteEngine on指令,也不要将不能应用的规则封装进去。

发表回复