Apache重写规则参数,apache重写规则


Apache模块 mod_rewrite
服务器变量: 引用方法是 
%{ NAME_OF_VARIABLE } 
NAME_OF_VARIABLE可以是下表列出的字符串之一: HTTP headers: connection & request:  
HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT
REMOTE_ADDR
REMOTE_HOST
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE

server internals: system stuff: specials: 
DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME
API_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
IS_SUBREQ
谨记: CondPattern是一个兼容perl的正则表达式, 但是还有若干增补:
可以在pattern串中使用’!’ 字符(惊叹号)来实现匹配的反转。 
CondPatterns有若干特殊的变种。除了正则表达式的标准用法,还有下列用法: 
’;CondPattern’ (词典顺序的大于)
将CondPattern视为纯字符串,与TestString以词典顺序相比较. 如果按词典顺序,TestString大于CondPattern,则为真. 
’=CondPattern’ (词典顺序的等于)
将CondPattern视为纯字符串,与TestString以词典顺序相比较. 如果按词典顺序,TestString等于CondPattern,则为真,即, 两个字符串(逐个字符地)完全相等。如果CondPattern只是\"\"(两个引号), 则TestString将与空串相比较. 
’-d’ (是一个目录[directory])
     将TestString视为一个路径名并测试它是否存在而且是一个目录. 
’-f’ (是一个常规的文件[file])
     将TestString视为一个路径名并测试它是否存在而且是一个常规的文件. 
’-s’ (是一个非空的常规文件[size])
     将TestString视为一个路径名并测试它是否存在而且是一个尺寸大于0的常规的文件. 
’-l’ (是一个符号连接[link])
     将TestString视为一个路径名并测试它是否存在而且是一个符号连接. 
’-F’ (对子请求有效的业已存在的文件)
     测试TestString是否一个有效的文件, 而且可以被服务器当前已经配置的所有存取控制所存取。 它用一个内部子请求来做判断,由于会降低服务器的性能,请小心使用! 
’-U’ (对子请求有效的业已存在的URL)
     测试TestString是否一个有效的URL, 而且可以被服务器当前已经配置的所有存取控制所存取。 它用一个内部子请求来做判断,由于会降低服务器的性能,请小心使用! 
注意
所有这些测试都可以用惊叹号作前缀(’!’)以实现条件的反转. 
另外,还可以为CondPattern追加特殊的标记
[flags] 
作为RewriteCond指令的第三个参数。 Flags是一个以逗号分隔的以下标记的列表:
’nocase|NC’ (no case)
      它使测试忽略大小写, 即, 扩展后的TestString和CondPattern中, ’A-Z’ 和’a-z’是没有区别的。此标记仅作用于TestString和CondPattern的比较, 而对文件系统和子请求的测试不起作用。 
’ornext|OR’ (or next condition)
      它以OR方式组合若干规则的条件,而不是隐含的AND。典型的例子如下: 
RewriteCond %{REMOTE_HOST}  ^host1.*  [OR]
RewriteCond %{REMOTE_HOST}  ^host2.*  [OR]
RewriteCond %{REMOTE_HOST}  ^host3.*
RewriteRule ...some special stuff for any of these hosts...
举例:
如果要按请求头中的``User-Agent:’重写一个站点的主页,可以这样写:
RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla.*
RewriteRule  ^/$                 /homepage.max.html  [L]
RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
RewriteRule  ^/$                 /homepage.min.html  [L]
RewriteRule  ^/$                 /homepage.std.html  [L]

RewriteEngine 指令
      RewriteEngine off    使用该指令可以使mod_rewrite模块无效
RewriteLog 指令
      RewriteLog \"/usr/local/var/apache/logs/rewrite.log\" 
      或者 RewriteLog logs/rewrite.log
RewriteLogLevel 指令 
      RewriteLogLevel 0     关闭所有的重写操作记录。
      使用较高的Level值会使Apache服务器速度急剧下降! 
      重写日志使用大于2的Level值只用于调试! 
      举例:     RewriteLogLevel 3
RewriteRule 指令
Text:
   .           Any single character
   [chars]     Character class: One  of chars
   [^chars]    Character class: None of chars
   text1|text2 Alternative: text1 or text2
Quantifiers:
   ?           0 or 1 of the preceding text
   *           0 or N of the preceding text (N >; 0)
   +           1 or N of the preceding text (N >; 1)
Grouping:
   (text)      Grouping of text
               (either to set the borders of an alternative or
               for making backreferences where the Nth group can 
               be used on the RHS of a RewriteRule with $N)
Anchors:
   ^           Start of line anchor
   $           End   of line anchor
Escaping:
   \char       escape that particular char
               (for instance to specify the chars \".[]()\" etc.)
在mod_rewrite中,还可以使用否字符(’!’)的pattern前缀,以实现pattern的反转。 
$N 反向引用RewriteRule的pattern 
%N 反向引用最后匹配的RewriteCond pattern 
规则条件测试字符串中(%{VARNAME})的服务器变量 
映射函数调用(${mapname:key|default}) 
[flags] 
作为RewriteRule指令的第三个参数。 Flags是一个包含以逗号分隔的下列标记的列表: 
[R]  (强制重定向 redirect)
[F]  (强制URL为被禁止的 forbidden)
     立即反馈一个HTTP响应代码403(被禁止的)。 
[G]  (强制URL为已废弃的 gone)
     立即反馈一个HTTP响应代码410(已废弃的) 
[P]  (强制为代理 proxy)
     并立即把处理移交给代理模块。
[L]  (最后一个规则 last)
     立即停止重写操作,并不再应用其他重写规则。 
[N]  (重新执行 next round)
     重新执行重写操作(从第一个规则重新开始). 
[C]  (与下一个规则相链接 chained)
     此标记使当前规则与下一个(其本身又可以与其后继规则相链接的, 并可以如此反复的)规则相链接。 它产生这样一个效果: 如果一个规则被匹配,通常会继续处理其后继规则, 即,这个标记不起作用;如果规则不能被匹配, 则其后继的链接的规则会被忽略。比如,在执行一个外部重定向时, 对一个目录级规则集,你可能需要删除``.www’’ (此处不应该出现``.www’’的)。 
[]’type|T=MIME-type’ (强制MIME类型 type)
    强制目标文件的MIME类型为MIME-type。 比如,它可以用于模拟mod_alias中的ScriptAlias指令, 以内部地强制被映射目录中的所有文件的MIME类型为``application/x-httpd-cgi’’. 
[NS] (仅用于不对内部子请求进行处理 no internal sub-request)
     在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。
[NC] (忽略大小写 no case)
     它使Pattern忽略大小写. 
[QSA] (追加请求串 query string append)
     此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。 
[NE] (在输出中不对URI作转义 no URI escaping)
     此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。
     例:RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 
        可以使’/foo/zed’转向到一个安全的请求’/bar?arg=P1=zed’. 
[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就是个典型的例子。
’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[]]’ (设置cookie)
它在客户端浏览器上设置一个cookie。 cookie的名称是NAME,其值是VAL。 domain字段是该cookie的域,比如’.apache.org’, 可选的lifetime是cookie生命期的分钟数, 可选的path是cookie的路径。 
注意
绝不要忘记,在服务器级配置文件中,Pattern是作用于整个URL的。 但是在目录级配置文件中, (一般总是和特定目录名称相同的)目录前缀会在pattern匹配时被自动删除, 而又在替换完毕后自动被加上。此特性对很多种重写是必须的,因为, 如果没有这个剥离前缀的动作,就必须与其父目录去匹配,而这并不总是可行的。 
但是有一个例外: 如果替换串以``http://’’开头, 则不会附加目录前缀, 而是强制产生一个外部重定向,或者(如果使用了P标记)是一个代理操作!
注意
为了对目录级配置启用重写引擎,你必须在这些文件中设置``RewriteEngine On’’, 并且打开``Options FollowSymLinks’。 如果管理员对用户目录禁用了FollowSymLinks, 则无法使用重写引擎。这个限制是为了安全而设置的。 
以下是所有可能的替换组合及其含义:
在服务器级配置中(httpd.conf)
,对这样一个请求 ``GET /somepath/pathinfo’’:
Given Rule                                      Resulting Substitution
----------------------------------------------  ----------------------------------
^/somepath(.*) otherpath$1                      not supported, because invalid!
^/somepath(.*) otherpath$1  [R]                 not supported, because invalid!
^/somepath(.*) otherpath$1  [P]                 not supported, because invalid!
----------------------------------------------  ----------------------------------
^/somepath(.*) /otherpath$1                     /otherpath/pathinfo
^/somepath(.*) /otherpath$1 [R]                 http://thishost/otherpath/pathinfo
                                                 via external redirection
^/somepath(.*) /otherpath$1 [P]                 not supported, because silly!
----------------------------------------------  ----------------------------------
^/somepath(.*) http://thishost/otherpath$1      /otherpath/pathinfo
^/somepath(.*) http://thishost/otherpath$1 [R]  http://thishost/otherpath/pathinfo
                                                 via external redirection
^/somepath(.*) http://thishost/otherpath$1 [P]  not supported, because silly!
----------------------------------------------  ----------------------------------
^/somepath(.*) http://otherhost/otherpath$1     http://otherhost/otherpath/pathinfo
                                                 via external redirection
^/somepath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
                                                 via external redirection
                                                 (the [R] flag is redundant)
^/somepath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
                                                 via internal proxy
在/somepath的目录级配置中
(即, 目录/physical/path/to/somepath的.htaccess文件中包含 RewriteBase /somepath)
对这样一个请求``GET /somepath/localpath/pathinfo’’:
Given Rule                                      Resulting Substitution
----------------------------------------------  ----------------------------------
^localpath(.*) otherpath$1                      /somepath/otherpath/pathinfo
^localpath(.*) otherpath$1  [R]                 http://thishost/somepath/otherpath/pathinfo
                                                 via external redirection
^localpath(.*) otherpath$1  [P]                 not supported, because silly!
----------------------------------------------  ----------------------------------
^localpath(.*) /otherpath$1                     /otherpath/pathinfo
^localpath(.*) /otherpath$1 [R]                 http://thishost/otherpath/pathinfo
                                                 via external redirection
^localpath(.*) /otherpath$1 [P]                 not supported, because silly!
----------------------------------------------  ----------------------------------
^localpath(.*) http://thishost/otherpath$1      /otherpath/pathinfo
^localpath(.*) http://thishost/otherpath$1 [R]  http://thishost/otherpath/pathinfo
                                                 via external redirection
^localpath(.*) http://thishost/otherpath$1 [P]  not supported, because silly!
----------------------------------------------  ----------------------------------
^localpath(.*) http://otherhost/otherpath$1     http://otherhost/otherpath/pathinfo
                                                 via external redirection
^localpath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
                                                 via external redirection
                                                 (the [R] flag is redundant)
^localpath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
                                                 via internal proxy
举例:
要重写这种形式的URL
/ Language /~ Realname /.../ File 
为
/u/ Username /.../ File . Language 
可以把这样的对应关系保存在/path/to/file/map.txt映射文件中, 此后,只要在Apache服务器配置文件中增加下列行,即可:
RewriteLog   /path/to/file/rewrite.log
RewriteMap   real-to-user               txt:/path/to/file/map.txt
RewriteRule  ^/([^/]+)/~([^/]+)/(.*)$   /u/${real-to-user:$2|nobody}/$3.$1
分类: linux

相关内容

    暂无相关文章