摘要
mod_rewrite模块使用一个基于规则的重写引擎,基于PCRE正则表达式解析器,来动态的重写请求URLs。通常,mod_rewrite映射一个URL到一个问及那系统的路径。然而,他同样可以用来重定向一个URl到另一个URL,或者调用一个内部的代理获取。mod_rewrite提供了一个灵活强大的方式来操作URL,使用规则数目不限制。每个规则拥有数目不限的附属规则条件,可以是你通过基于服务变量,环境变量,HTTP头或者时间戳来重写URL。mod_rewrite对全URL路径进行操作,包括path-info部分。一个重写规则可以在httpd.conf中调用,或者在.htaccess中。重写规则产生的路径可以包括一个查询字符串,导致内部子处理,外部请求重定向,内部代理的吞吐量。
日志
mod_rewrite提供了trace1到trace8日志级别的详细日志行为。日志级别可以被mod_rewrite的LogLevel指令特别设置。达到debug级别是,不记录行为,trace8表示记录所有行为。
使用高的日志跟踪级别将大幅减慢Apache HTTP Server。使用高于trace2级别的日志水平只用于调试。
示例:
LogLevel alert rewrite:trace3
RewriteLog
和早期mod_rewrite版本像是,可以查看RewriteLog和RewriteLogLevel指令。这一功能已经完全被上面提到的新的 per-module日志配置代替。获得mod_rewrite特定色日志消息,通过日志文件管道grep:
tail -f error_log|fgrep '[rewrite:'
RewriteBase 指令
Description: Sets the base URL for per-directory rewrites
Syntax: RewriteBase URL-path
Default: None
Context: directory, .htaccess
Override: FileInfo
Status: Extension
Module: mod_rewrite
RewriteBase指令指定了URL前缀,总目录(htaccess)RewriteRule指令用来替代相对路径。当你使用相对路径在上下文中代替总目录(htaccess)时,除非以下任何条件为真,该指令是必须的:
- 源请求,代替在DocumentRoot下(和其他可到达的方式相对应,如Alias)。
- 文件路径的目录包含RewiteRule,通过相关的替代添加后缀,而且是服务器上有效的到URL路径(这比较少见)。
- 在Apache HTTP Server2.4.16及以后版本,该指令通过Alias、mod_userdir映射时可以省略。
在下面的例子中,RewriteBase对于避免重写到 http://example.com/opt/myapp-1.2.3/welcome.html是必须的,因为源没有和document root相关。这个配置错误通常造成服务寻找document root下面的“opt”目录。
DocumentRoot "/var/www/example.com"
AliasMatch "^/myapp" "/opt/myapp-1.2.3"
<Directory "/opt/myapp-1.2.3">
RewriteEngine On
RewriteBase "/myapp/"
RewriteRule "^index\.html$" "welcome.html"
</Directory>
RewriteCond指令
Description: Defines a condition under which rewriting will take place
Syntax: RewriteCond TestString CondPattern [flags]
Context: server config, virtual host, directory, .htaccess
Override: FileInfo
Status: Extension
Module: mod_rewrite
RewriteCond指令定义了一个规则限制。一个或多个RewriteCond可以放置在RewriteRule前面。当前URI的状况匹配他的模式并且这些条件都符合,以下规则才可以使用。
TestString是一个包括了下面扩展结构除了纯文本的字符串。
RewriteRule反向引用:这些是固有的反向引用格式$N(0<=N<=9),$1到$9提供到该结构分组部分(在圆括号里)的访问。RewriteRule首当前的RewriteCond设置条件管控。0$提供整个匹配的字符串的访问。
RewriteCond方向引用: 这些是固有的反向引用格式%N(0<=N<=9) 。1%到9%提供该结构(从当前条件设置中匹配的 最后一个RewriteCond)分组部分(同样是圆括号)的访问。%0提供整个匹配字符串的访问。
RewriteMap扩展:扩展的固有格式${mapname:key|defaul}。查看 the documentation for RewriteMap获取更多细节。
Server_variables:变量的固有格式%{NAME_OF_VARIABLE},NAME_OF_VARIABLE可以是以下列表的字符串:
HTTP headers: | connection & request: | |
---|---|---|
HTTP_ACCEPT HTTP_COOKIE HTTP_FORWARDED HTTP_HOST HTTP_PROXY_CONNECTION HTTP_REFERER HTTP_USER_AGENT | AUTH_TYPE CONN_REMOTE_ADDR CONTEXT_PREFIX CONTEXT_DOCUMENT_ROOT IPV6 PATH_INFO QUERY_STRING REMOTE_ADDR REMOTE_HOST REMOTE_IDENT REMOTE_PORT REMOTE_USER REQUEST_METHOD SCRIPT_FILENAME | |
server internals: | date and time: | specials: |
DOCUMENT_ROOT SCRIPT_GROUP SCRIPT_USER SERVER_ADDR SERVER_ADMIN SERVER_NAME SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE | TIME_YEAR TIME_MON TIME_DAY TIME_HOUR TIME_MIN TIME_SEC TIME_WDAY TIME | API_VERSION CONN_REMOTE_ADDR HTTPS IS_SUBREQ REMOTE_ADDR REQUEST_FILENAME REQUEST_SCHEME REQUEST_URI
THE_REQUEST
|
这些变量与HTTP MIME-headers,Apache HTTP Server的C变量,Unix系统的tm字段结构这些相似的命名相符。大都文档在这里或是手册的其他地方或是CGI说明书!
SERVER_NAME和SERVER_PORT分别依赖于UseCanonicalName和UseCanonicalPhysicalPort的值。