Apache模块 mod_rewrite
说明 | 一个基于一定规则的实时重写URL请求的引擎 |
---|---|
状态 | 扩展(E) |
模块名 | rewrite_module |
源文件 | mod_rewrite.c |
兼容性 | 仅在 Apache 1.3 及以后的版本中可用 |
概述
此模块提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。此URL操作可以依赖于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查找数据库。
此模块可以操作URL的所有部分(包括路径信息部分),在服务器级的(httpd.conf
)和目录级的(.htaccess
)配置都有效,还可以生成最终请求字符串。此重写操作的结果可以是内部子处理,也可以是外部请求的转向,甚至还可以是内部代理处理。
但是,所有这些功能和灵活性带来一个问题,那就是复杂性,因此,不要指望一天之内就能看懂整个模块
ReWriteBase
说明 | 设置目录级重写的基准URL |
---|---|
语法 | RewriteBase URL-path |
默认值 | 参见使用方法 |
作用域 | directory, .htaccess |
覆盖项 | FileInfo |
状态 | 扩展(E) |
模块 | mod_rewrite |
# /abc/def/.htaccess -- /abc/def 目录的配置文件 # 注意:/abc/def 是 /xyz 的物理路径(例如存在一条'Alias /xyz /abc/def'指令)。 RewriteEngine On # 让服务器知道我们使用的是 /xyz 而不是物理路径 /abc/def RewriteBase /xyz # 重写规则 RewriteRule ^oldstuff\.html$ newstuff.html
上述例子中,对/xyz/oldstuff.html
的请求被正确地重写为对物理文件/abc/def/newstuff.html
的请求。
仅供Apache Hacker们参考
以下列出了内部处理的详细步骤:
请求: /xyz/oldstuff.html 内部处理过程: /xyz/oldstuff.html -> /abc/def/oldstuff.html (per-server Alias) /abc/def/oldstuff.html -> /abc/def/newstuff.html (per-dir RewriteRule) /abc/def/newstuff.html -> /xyz/newstuff.html (per-dir RewriteBase) /xyz/newstuff.html -> /abc/def/newstuff.html (per-server Alias) 结果: /abc/def/newstuff.html
虽然这个过程看来很繁复,但是由于目录级重写的到来时机已经太晚了,它不得不把这个(重写)请求重新注入到Apache核心中,所以Apache内部确实是这样处理的。但是:它的开销并不象看起来的那样大,因为重新注入完全在Apache服务器内部进行,而且这样的过程在Apache内部也为其他许多操作所使用。所以,你可以充分信任其设计和实现是正确的