快捷搜索:   nginx

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_aliasmod_rewrite就是个典型的例子。

  • 'qsappend|QSA'(追加查询字符串)
    此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
  • 'redirect|R [=code]'(强制重定向)
    Substitutionhttp://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


    顶(0)
    踩(0)

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

    最新评论