<-
Apache HTTP 服务器 2.4 > 正则表达式和mod_rewrite简介

Apache mod_rewrite简介

本文档是mod_rewrite 参考文档的补充。它描述了使用必需的基本概念 mod_rewrite。其他文档也有更详细的介绍,但是此文档应该可以帮助初学者入门。

支持Apache!

也可以看看

最佳

介绍

Apache模块mod_rewrite是一个非常强大且复杂的模块,它提供了一种进行URL操作的方法。有了它,您几乎可以完成可能需要的所有类型的URL重写。但是,它有些复杂,可能会对初学者造成威胁。还有一种趋向于将重写规则视为魔咒,在不真正理解其作用的情况下使用它们。

本文试图提供足够的背景知识,以便理解以下内容,而不是盲目地复制。

请记住,许多常见的URL操作任务不需要的全部功能和复杂性mod_rewrite。有关简单的任务,请参见mod_alias以及有关将URL映射到文件系统的文档。

最后,在继续之前,请确保mod_rewrite使用LogLevel指令将的日志级别配置 为跟踪级别之一。尽管这可以提供大量信息,但是它在调试mod_rewrite配置问题时必不可少,因为它将准确告诉您每个规则的处理方式。

最佳

常用表达

mod_rewrite使用Perl兼容的正则表达式词汇表。在本文档中,我们不尝试提供对正则表达式的详细参考。为此,我们推荐Jeffrey Friedl撰写PCRE手册页Perl正则表达式手册页Mastering正则表达式

在本文档中,我们尝试提供足够的正则表达式词汇表,以助您入门,而又不为所动,希望 RewriteRules是科学公式,而不是魔咒。

正则表达式词汇

以下是编写正则表达式和RewriteRules 所需的最小构建块。它们当然不能代表完整的正则表达式词汇,但是它们是一个很好的起点,应该可以帮助您阅读基本的正则表达式以及编写自己的正则表达式。

字符 含义
. 匹配任何单个字符 c.t将匹配catcotcut,等
+ 重复上一场比赛一次或多次 a+比赛aaaaaa,等
* 重复上一次匹配零次或多次 a*匹配所有相同的东西a+,但也会匹配一个空字符串
? 使比赛成为可选 colou?r将匹配colorcolour
\ 转义下一个字符 \.将匹配.(点),而不是如上所述的任何单个字符
^ 称为锚,匹配字符串的开头 ^a 匹配以开头的字符串 a
$ 另一个锚点,它匹配字符串的结尾 a$ 匹配以结尾的字符串 a
( ) 将几个字符分组为一个单元,并捕获一个匹配项以用于向后引用 (ab)+匹配ababab-即 +适用于该组。有关反向引用的更多信息,请参见 下文
[ ] 字符类-匹配字符之一 c[uoa]t匹配cutcotcat
[^ ] 负字符类-匹配未指定的任何字符 c[^/]t匹配catc=t但不c/t

mod_rewrite!字符可以在正则表达式之前被用于否定它。也就是说,仅当字符串与表达式的其余部分不匹配时,才认为字符串已匹配。

正则表达式反向引用可用性

这里要记住的一件事是:每当在PatternCondPattern之一中使用括号时,内部都会创建反向引用,该 反向引用可用于字符串$Nand %N(请参见下文)。这些可用于创建的Substitution参数 RewriteRule或的TestString参数 RewriteCond

RewriteRule模式中的 捕获(违反直觉)可用于所有前面的 RewriteCond指令,因为RewriteRule 表达式是在各个条件之前求值的。

图1显示了将反向引用扩展到哪个位置,并说明了RewriteRule,RewriteCond匹配的流程。在下一章中,我们将探索如何使用这些反向引用,因此,如果一开始看起来有点陌生,请不要担心。

RewriteRule和RewriteCond匹配的流程
图1:规则的反向引用流程。
在此示例中,对的请求/test/1234将转换为/admin.foo?page=test&id=1234&host=admin.example.com

最佳

RewriteRule基础

A RewriteRule由三个参数组成,以空格分隔。参数是

  1. 模式:哪些传入URL应受规则影响;
  2. 替代:匹配的请求应该发送到哪里;
  3. [flags]:影响重写请求的选项。

模式是一个正则表达式。它最初(对于第一个重写规则或直到发生替换)与传入请求的URL路径(主机名之后但在表示查询字符串开头的任何问号之前的部分)匹配,或者在每个目录中匹配上下文,相对于相对于定义规则的目录的请求路径。一旦发生替换,则将遵循的规则与替换值进行匹配。

RewriteRule指令的语法
图2: RewriteRule指令的语法。

换人本身可以是以下三种情况之一:

资源的完整文件系统路径
RewriteRule "^/games" "/usr/local/games/web"

这将请求映射到文件系统上的任意位置,就像该Alias指令一样。

资源的网络路径
RewriteRule "^/foo$" "/bar"

如果DocumentRoot设置为/usr/local/apache2/htdocs,则此伪指令会将请求映射http://example.com/foo到路径/usr/local/apache2/htdocs/bar

绝对网址
RewriteRule "^/product/view$" "http://site2.example.com/seeproduct.html" [R]

这告诉客户端对指定的URL发出新请求。

换人也可以包含反向引用到由匹配输入的URL路径的部分模式。考虑以下:

RewriteRule "^/product/(.*)/view$" "/var/web/productdb/$1"

该变量$1将替换为Pattern中括号内的表达式所匹配的任何文本。例如,对的请求http://example.com/product/r14df/view将映射到path /var/web/productdb/r14df

如果在括号多于一种的表达,他们为了在变量可用$1$2$3,等等。

最佳

重写标志

RewriteRule可以通过在规则末尾应用一个或多个标志来修改a的行为。例如,可以通过应用[NC]标志来使规则的匹配行为不区分大小写:

RewriteRule "^puppy.html" "smalldog.html" [NC]

有关可用标志,它们的含义和示例的更多详细信息,请参阅“ 重写标志”文档。

最佳

改写条件

一个或多个RewriteCond 指令可用于限制将要遵循的请求的类型RewriteRule。第一个参数是描述请求特征的变量,第二个参数是必须与变量匹配的正则表达式,第三个可选参数是标志列表,这些标志修改了评估匹配的方式。

RewriteCond指令的语法
图3: RewriteCond指令的语法

例如,要将所有请求从特定IP范围发送到其他服务器,可以使用:

RewriteCond "%{REMOTE_ADDR}" "^10\.2\."
RewriteRule "(.*)"           "http://intranet.example.com$1"

如果RewriteCond指定多个,则它们都必须匹配RewriteRule才能应用。例如,要拒绝查询字符串中包含单词“ hack”的请求,除非它们还包含包含单词“ go”的cookie,则可以使用:

RewriteCond "%{QUERY_STRING}" "hack"
RewriteCond "%{HTTP_COOKIE}"  !go
RewriteRule "."               "-"   [F]

请注意,感叹号指定了否定匹配,因此仅当cookie不包含“ go”时才应用该规则。

在包含于该正则表达式的匹配项RewriteConds时,可以用作部分替代RewriteRule使用变量%1%2等等。例如,这将将请求定向到根据用于接入该网站的主机名不同的目录:

RewriteCond "%{HTTP_HOST}" "(.*)"
RewriteRule "^/(.*)"       "/sites/%1/$1"

如果请求是http://example.com/foo/bar%1则将包含example.com$1将包含foo/bar

最佳

改写地图

RewriteMap指令规定的方式来调用外部函数,可以这么说,做你重写你。RewriteMap补充文档中对此进行了更详细的讨论。

最佳

.htaccess文件

重写通常在主服务器配置设置(在任何<Directory>部分之外)或<VirtualHost> 容器内部进行配置。这是最简单的重写方法,建议使用。但是,可以在<Directory> 部分或.htaccess 文件内部进行重写,但会增加一些复杂性。此技术称为按目录重写。

每个服务器重写的主要区别在于,包含.htaccess文件的目录的路径前缀在匹配之前被剥离RewriteRule。此外,RewriteBase应该使用来确保正确映射请求。

可用语言: zh  |  fr 

最佳

注释

注意:
这不是“问答”部分。此处放置的评论应指向有关改进文档或服务器的建议,如果实施或被认为无效/偏离主题,我们的主持人可以将其删除。有关如何管理Apache HTTP Server的问题,应直接指向我们的IRC频道#httpd(位于Freenode上),或发送至我们的邮件列表
目前,此页面已禁用评论。