Apache Web Server——RewriteRule
作者:张桂权
(摘自《 正则表达式袖珍手册》一书。译者,张桂权。可以从http://download.csdn.net/source/346896下载完整的译稿。如果感觉不错就去买一本原版的书吧,Regular Expression Pocket Reference,支持原书的作者。看PDF文件也是很累的。看完之后别忘了,给我提宝贵意见哦。谢谢。ajax.mailer@gmail.com)
重写引擎强化了基于正则表达式的URLs重写。这个功能通过RewriteEngine On定向来实现。绝大多数的重写是单行的RewriteRule或一个RewriteCond紧跟一个RewriteRule的联合。
RewriteRule pattern substitution [[FLAG1, FLAG2, ...]]
如果URL被pattern成功匹配,那么把URL重写为substitution。substitution可以包含RewriteRule模式的回引($N),最后匹配的RewriteCond模式的回引(%N),以及规则中条件测试字符串(test-strings)中的一些变量(%{VARNAME}),和映射函数调用(${mapname:key|default})。表53中列出的可选标识,当匹配发生时引发服务器的一系列行为。
ReeorteCond teststring pattern
为了应用一个RewriteRule,定义一个测试条件(表54)。RewriteRule前面的多个RewriteCond之间通过隐含的AND来连接,除非被指定为OR。 teststring可以包含RewriteRule模式的回引($N),最后匹配的RewriteCond模式的回引(%N),以及规则中条件测试字符串(test-strings)中的一些变量(%{VARNAME}),和映射函数调用(${mapname:key|default})。
表55中列出了对重写有影响的一些变量。
Apache RewriteRule标识 | |
模式 | 模式描述 |
C | 下一个规则的链(chain)。如果规则匹配,则实行重写,以及紧接的被链的重写,否则中止链。 |
CO=NAME:VAL:domain [:lifetime[:path]] | 设置cookie。 |
E=VAR:VAL | 设置一个环境变量 |
F | 禁止;发送403代码 |
G | 已经转移;发送401代码 |
H=Content-handler | 发送内容的操作者 |
L | 最后的规则;不使用任何更多的重写规则。 |
N | 下一个规则;在新的重写URL中使用这个规则。 |
表54 Apache RewriteRule标识
Apache RewriteRule标识(续) | |
模式 | 模式描述 |
NC | 没有大小写;使用大小写不敏感的匹配。 |
NE | 让URL转义规则的应用程序不能对规则的输出进行转义 |
NS | 如果请求是内部的子请求,则跳过处理 |
P | 停止重写处理,转而处理一个内部代理请求的结果 |
PT | 转移到下一个操作者,设置请求结构,这样Alias,ScriptAlias和Redirect可可以作用于结果。 |
QSA | 填充查询字符串 |
R[=Code] | 重定向到一个新的URL可选码。默认码为302。 |
S=num | 跳过后续的num个规则。 |
T=MIME-type | 设置MIME类型 |
表54 Apache RewriteRule标识(续)
Apache RewriteCond标识 | |
模式 | 模式描述 |
NC | 没有大小写;使用大小写不敏感的匹配。 |
OR | 用一个局部的OR来连接规则条件,而不是隐含的AND。 |
表55 Apache RewriteCond标识
Apache Server 变量 | |
HTTP头部 | 连接和请求 |
HTTP_USER_AGENT | REMOTE_ADDR |
HTTP_REFERER | REMOTE_HOST |
HTTP_COOKIE | REMOTE_PORT |
HTTP_FORWARDED | REMOTE_USER |
HTTP_HOST | REMOTE_IDENT |
HTTP_PROXY_CONNECTION | REQUEST_METHOD |
HTTP_ACCEPT | SCRIPT_FILENAME |
Server internals | PATH_INFO |
DOCUMENT_ROOT | AUTH_TYPE |
表56 Apache Server 变量
Apache Server 变量(续) | |
HTTP头部 | 连接和请求 |
SERVER_ADMIN | Date and time |
SERVER_ADDR | TIME_YEAR |
SERVER_PORT | TIME_MON |
SERVER_PROTOCOL | TIME_DAY |
Special | TIME-MIN |
API_VERSION | TIME_WDAY |
THE_REQUEST | TIME |
REQUEST_URI |
|
REQUEST_FILENAME |
|
IS_SUBREQ |
|
HTTPS |
|
Matching Directives
另外一些Apache命令有效的利用了正则表达式。以下是最通用的几个命令。
AliasMatch pattern file-path|directory-path
把URLs映射到文件系统的一个位置。使用子匹配变量$1...$n来访问文件路径结果中的子匹配。
<DirectoryMath pattern>...</DirectiryMatch>
当文件系统目录匹配pattern时,使用最近的一个定向。
<FilesMatch pattern>...</FilesMatch>
当文件匹配pattern时,使用最近的一个定向。
<LocationMatch pattern>...</LocationMatch>
当URL匹配pattern时,使用最近的一个定向。
<ProxyMatch pattern>...</ProxyMatch>
当URL匹配pattern时,使用最近的一个定向。
实例
实例31 简单匹配
实例31 简单匹配 |
# Rewrite /foo to /bar RewriteEngine On RewriteRule ^/foo$ /bar |
实例32 匹配和归组
实例32匹配和归组 |
# Rewrite pretty url as script parameters RewriteRule ^/(/w+)/(/d+) /index.php?action=$1&id=$2 |
实例33 重写条件
实例33 重写条件 |
# Limit admin url to internal IP addresses
RewriteCond %{REMOTE_ADDR} !192.168./d*./d* RewriteCond %{PATH_INFO} ^admin RewriteRule .* - [F] |
实例34 重定向
实例34重定向 |
# Make sure admin urls are served over SSL RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^/admin/(.*)$ https://www.example.com/admin/$1 [L,R] |