Apache RewriteRule的标志一览(2)
/abc
重写为/def
, 然后再使用mod_alias
将/def
转换为/ghi
,可以这样:
RewriteRule ^/abc(.*) /def$1 [PT]
Alias /def /ghi
PT
标记,虽然将uri=/abc/...
重写为filename=/def/...
的部分运作正常,但是后续的mod_alias
在试图将URI转换到文件名时会遭遇失效。
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias
和mod_rewrite
就是个典型的例子。
qsappend|QSA
'(追加查询字符串)此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
redirect|R
[=code]'(强制重定向)若Substitution以
http://thishost[:thisport]/
(使新的URL成为一个URI)开头,可以强制性执行一个外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即可(或使用下列符号名称之一:temp
(默认), permanent
, seeother
)。使用它可以把规范化的URL反馈给客户端,如将"/~
"重写为"/u/
",或始终对/u/
user加上斜杠,等等。注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上
http://thishost[:thisport]/
前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使用'L'标记。skip|S
=num'(跳过后继规则)此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的
skip=N
个规则是else从句。注意:它和'chain|C'标记是不同的!type|T
=MIME-type'(强制MIME类型)强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让
.php
文件在以.phps
扩展名调用的情况下由mod_php
按照PHP源代码的MIME类型(application/x-httpd-php-source)显示:
RewriteRule ^(.+\.php)s$ $1 [T=application/x-httpd-php-source]
目录级重写
为了在.htaccess文件中针对特定目录使用重写引擎,你必须同时设置"RewriteEngine On
"和"Options FollowSymLinks
"。如果管理员禁止了该目录的FollowSymLinks
特性,重写引擎将不会工作,这样做的原因是处于安全方面的考虑。
在服务器级配置中,模式匹配是作用于整个URL的。但是在目录级配置文件.htaccess
中使用重写引擎的时候,目录前缀(一般总是和特定的目录名称相同)将会在模式匹配前被自动移除并在替换完成后被自动添加回去。这个特性对于重写来说是非常重要的,否则你就被迫必须总是对父目录进行匹配,而这并不总是可行的。这里有一个例外:如果替换字符串以"http://
"开头,则不会添加目录前缀,而是强制执行一个外部重定向或代理操作(如果使用了P标志的话)。参见RewriteBase
指令以获得更多信息。
还可以在<Directory>
配置段中使用重写引擎,前缀匹配规则与在.htaccess
中使用重写引擎时完全相同,并且这种做法更加简单。然而,为了避免前缀替换复杂化,我们还是建议尽量将重写规则放置在主服务器或虚拟主机配置部分,而不是放置在<Directory>
配置段中。
虽然重写规则在语法上允许放置在<Location>
配置段中,但这不是必须的,并且我们也反对这样做。
注意:绝对URL的替换
当替换字段以"http://thishost[:thisport]
"作为前缀时,mod_rewrite
会将它自动剥离出去。在配合生成主机名部分的映射函数使用的时候,这个对隐含的外部重定向URL的简化操作是有用的而且是重要的。下面的第一个例子有助于理解这点。
谨记:由于此功能的存在,以"http://thishost
"为前缀的无条件外部重定向到自身所在的服务器是无效的。要实现一个到自身的重定向,必须使用R标记。
注意:查询字符串
Pattern不会按照查询字符串进行匹配。为了达到这个目的,你必须使用一个带有%{QUERY_STRING}
变量的RewriteCond
指令。当然,你也可以在替换字符串中创建包含查询字符串的URL:在替换字符串串中使用问号,以标明其后的部分应该被重新注入到QUERY_STRING中。而要删除一个已有的请求串,则可以用问号来终结替换字符串。为了联合新旧查询字符串,请使用[QSA]
标志。
以下是所有可能的替换组合及其含义:
在服务器级配置中(httpd.conf
)
对给定的请求"GET /somepath/pathinfo
":
给定的规则 得到的替换字符串
---------------------------------------------- ----------------------------------
^/somepath(.*) otherpath$1 非法,不被支持
^/somepath(.*) otherpath$1 [R] 非法,不被支持
^/somepath(.*) otherpath$1 [P] 非法,不被支持
---------------------------------------------- ----------------------------------
^/somepath(.*) /otherpath$1 /otherpath/pathinfo
^/somepath(.*) /otherpath$1 [R] http://thishost/otherpath/pathinfo
通过外部重定向
^/somepath(.*) /otherpath$1 [P] 毫无意义,不被支持
---------------------------------------------- ----------------------------------
^/somepath(.*) http://thishost/otherpath$1 /otherpath/pathinfo
^/somepath(.*) http://thishost/otherpath$1 [R] http://thishost/otherpath/pathinfo
通过外部重定向
^/somepath(.*) http://thishost/otherpath$1 [P] 毫无意义,不被支持
---------------------------------------------- ----------------------------------
^/somepath(.*) http://otherhost/otherpath$1 http://otherhost/otherpath/pathinfo
通过外部重定向
^/somepath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
通过外部重定向
([R]标记是多余的)
^/somepath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
通过内部代理
在/somepath
的目录级配置中
(也就是/physical/path/to/somepath/.htacccess
文件中含有:RewriteBase /somepath
)
对给定的请求"GET /somepath/localpath/pathinfo
":
给定的规则 得到的替换字符串
---------------------------------------------- ----------------------------------
^localpath(.*) otherpath$1 /somepath/otherpath/pathinfo
^localpath(.*) otherpath$1 [R] http://thishost/somepath/otherpath/pathinfo
通过外部重定向
^localpath(.*) otherpath$1 [P] 毫无意义,不被支持
---------------------------------------------- ----------------------------------
^localpath(.*) /otherpath$1 /otherpath/pathinfo
^localpath(.*) /otherpath$1 [R] http://thishost/otherpath/pathinfo
通过外部重定向
^localpath(.*) /otherpath$1 [P] 毫无意义,不被支持
---------------------------------------------- ----------------------------------
^localpath(.*) http://thishost/otherpath$1 /otherpath/pathinfo
^localpath(.*) http://thishost/otherpath$1 [R] http://thishost/otherpath/pathinfo
通过外部重定向
^localpath(.*) http://thishost/otherpath$1 [P] 毫无意义,不被支持
---------------------------------------------- ----------------------------------
^localpath(.*) http://otherhost/otherpath$1 http://otherhost/otherpath/pathinfo
通过外部重定向
^localpath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
通过外部重定向
([R]标记是多余的)
^localpath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
通过内部代理
*****更多关于mod_rewrite的内容,参见:http://man.chinaunix.net/newsoft/ApacheMenual_CN_2.2new/mod/mod_rewrite.html
- 最新评论