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] |