apache_rewrite语法学习

/*
主要针对APACHE
*/
------------------------------------------------------
1. RewriteEngine 指令
说明
打开或关闭运行时的重写引擎
语法
RewriteEngine on|off
默认值
RewriteEngine off
作用域
server config,virtual host,directory,.htaccess
RewriteEngine on|off #on开启,#off关闭所有rewrite指定
--------------------------------------------------------
2. RewriteOptions 指令
说明
为重写引擎设置一些特殊的选项
语法
RewriteOptions Options
默认值
RewriteEngine off
作用域
server config,virtual host,directory,.htaccess
兼容性
MaxRedirects在2.1及以后的版本种已经不可用
--------------------------------------------------------
3. RewriteLog 指令
说明
设置重写引擎日志的文件名
语法
RewriteOptions file_path
作用域
server config,virtual host,directory,.htaccess
关闭
要关闭日志,可以删除或注解RewriteLog指令,或者使用
"RewriteLogLevel 0"的设置

NOTE:RewriteLog 和 RewriteLogLevel 指令作用域是server config,virtual host
要放在系统配置文件的。放在.htaccess中会出错。
--------------------------------------------------------
4. RewriteLogLevel 指令
说明
设置重写日志的详细程度
语法
RewriteLogLevel Level
默认值
RewriteLogLevel 0
作用域
server config,virtual host
NOTE:设置日志级别0表示没有,2以上用于DEBUG,9级以上表示全部信息
RewriteLogLevel 0 来禁止日记
使用较高的Level值会使APACHE服务器速度急剧下降!重写日志使用大于2的level
只能用于调试!
----------------------------------------------------------
4. RewriteBase 指令
说明
设置目录级重写的基准URL
语法
RewriteBase URL-path
作用域
directory,.htaccess
NOTE:RewriteBase指令显示设置了目录级重写的基准,在下文中,你将看到RewriteRule
可以用于目录级的配置文件中(.htaccess)并在局部范围内起作用,即规则实际处理的只
是剥离了本地路径前缀的一部分。处理结束后,这个路径会被自动地附着回去。默认值"
RewriteBase physical-directory-path"。
exp:
RewriteBase /
对根目录进行重写
----------------------------------------------------------
5. RewriteRule 指令
说明
为重写引擎定义重写规则
语法
RewriteRule Pattern Substitution[flag]
作用域
server config,virtual host,directory,.htaccess

NOTE:一条RewriteRule指令,定义一条重写规则,规则间的顺序非常重要
Pattern参数:
pattern是一个作用于当前URL的perl兼容的正则表达式
*******
正则表达式的一些用法:
. 任何一个单字符
[char] 'chars'中的任意一个字符
[^char] 不在'chars'中的字符
test1|test2 选择:test1 或 test2
量词:
?前面字符出现0或1次
*前面字符出现0或N次(N>0)
+前面字符出现1或N次(N>1)

组:
(test)$N 引用第几分组
锚:
^锚定到行首
$锚定到行尾
转义:
\c对给定的字符c进行转义(比如对".[]()")等进行转义,另外还可以使用否定
字符"!"前缀进行反义,取相反规则。

Substitution 参数会被用来替换相应的匹配,它除了可以是普通的字符串以外还
可以包括:
$N N表示序号,N=0~9,数字号与PATTERN想核匹配
%N引用最后一个RewriteCond模板中匹配的数据,N表示序号
%{VARNAME}服务器变量
${mapname:key|default}映射函数调用。当substitution有"-"前缀时,表示
不进行替换,只做匹配检查。
flag参数:
flag是可选参数,当有多个标志同时出现时,彼此间以逗号分隔.
redirect|R [=code] 强制重定向
给当前的URL增加前缀http://thishost[:thisport]/,从而生成一个新的URL,强制
生成一个外部重定向(external redirection,指生的URL发送到客服端,由客服端在此
以新的URL发送请求,最然新URL仍指向当前的服务器).如果没有指定的CODE值,则HTTP
应答以状态值302(MOVED TEMPORARILY),如果想使用300-400(不含)间的其他值可以通过
在code的位置以相应的数字指定,也可以用标志名指定:[temp(默认值) permanent,see other]
forbidden|F
强制禁止访问URL所指的资源立即返回状态值403[forbidden]的应答包。将这个标志与
合适的RewriteConds联合使用,可以阻断访问某些Url。
gone|G
强制返回URL所指资源不存在,立即返回状态值410(gone)的应答包。用这个标志来标记URL
所指的资源永久消失了。
proxy|P
强制将当前URL送往代理模块这个标志,强制将substitution当做一个发向代理模块的请求,并
立即将请求送往代理模块.因此,必须确保substitution串是一个合法的URL(如,典型的情况是以
http://hostname开头),否则会从代理模块得到一个错误.这个标志,是ProxyPass指令的一个
更强劲的实现,将远程请求(remote stuff)映射到本地服务器的名字空间(namespace)中来,注意,
使用这个功能必须确保代理模块已经编译到APACHE服务器中.可用"h0ttpd -l"命令,来检查输入中
是否含有mod_proxy.c来确认以下。如果没有,而需要使用这个功能,则需要重新编译"httpd"
程序并使用mod_proxy有效.
last|L
终止重写流程,不再对当前URL施加更多的重写规则。这相当于PERL的last命令或c的break命令;
next|N
下一轮,重新从第一条重写规则开始执行重写过程,新开的过程中的URL不应当与最初的URL相同。
这相当于PERL的next命令或c的continue命令,千万小心不要产生死循环.
chain|C
将当前的规则与其后续规则绑定(chanined)当规则匹配时,处理过程与没有捆绑一样,如果规则
不匹配,则捆绑在一起的后续规则也在检查和执行。
type|T=MIME-TYPE 强制mime类型
强制将

目标文件的mime-type为某mime类型。
nosubreq|NS userd only if no internal sub-request
这个标示强制重写引擎跳过为内部sub-request的重写规则:
当mod_include试图找到某一目录下的默认文件时(index.xxx),sub-requests会在Apache内部发生,
sub-requests并非总是有用的,在某些情况下如果整个规则集施加到它上面,会产生错误。利用这个标
志可排除执行一些规则。
nocase|NC 模板不区分大小写
这个标志会使得模板匹配当前URL时忽略大小写得差别。
qsappend|QSA 追加请求串
这个标志,强制重写引擎为substitution的请求串追加一部分串,则不是替换掉原来的.借助这个标志,
可以使用一个重写规则给请求串增加更多的数据.
noescape|NE 不对输出结果中的特殊字符进行转义处理
通常情况下,mod_write的输出结果中,特殊字符(如'%','$',';',等)会转义为他们的16进制形式(如分别为,'%'
,'$',';').这个标志会禁止mod_rewrite对输出结果进行此类操作。这个标志只能在apache1.3.20及以后的版本
中使用。
passthrough|PT 通过下一个处理器
这个标志强制重写引擎用filename字段的值来替换内部request_rec数据结构中uri字段的值.使用这个标志,可以
使用后续的其他uri-to-filename转换器
skip|S=num 跳过后面的num个规则
当前规则匹配时,强制重写引擎跳过后续的num个规则。用这个可以来模仿if-then-else结构:then子句的最后
一条rule的标志是skip=N,而N是else子句的规则条数.
env|E=VAR:VAL 设置环境变量
设置名为VAR的环境变量的值为VAL其中VAL中可以含有正则式的后向引用($N或%N)。这个标志可以使用多次,
以设置多个环境变量.这儿设置的变量,可以在多种情况下被应用,如在XSSI或CGI中。另外,也可以在
RewriteCond模板中以%{ENV:VAR}的形式被引用。
NOTE:如果要在某个目录范围内启动重写引擎,则需要在相应的目录配置文件中设置"RewriteEngine on",
且目录的"Options FollowSymlinks"必须设置。如果管理由于安全原因没有打开FollowSymlinks,则不能使用
重写引擎.
RewriteRule ^test/(\d*)$test.php?id=$1 [NC,L]
则可以用http://localhost/test/s不区分大小写访问根目录下的test.php文件3则作为值传递给id
===================================================================================================================

6. RewriteCond 指令
说明
定义重写发生的条件
语法
RewriteCond TestString condPattern [flags]
默认值
RewriteEngine off
作用域
server config,virtual host,directory,.htaccess
RewriteEngine on|off #on开启,#off关闭所有rewrite指定
NOTE:
RewriteCond指令定义了规则生效的条件,即在一个RewriteRule指令之前可以有一个或多个
RewriteCond指令。条件之后的重写

规则仅在当前URI与Pattern匹配并且满足此处的条件
(TestString能够与CondPattern匹配)时才会起作用。
**************************************************************************************

1.TestString参数
TestString是一个纯文本的字符串,但是还可以包含下列可扩展的成分:
(1).RewriteRule反向引用 :
$N N表示序号,N=0~9 ,数字号与Pattern相核匹配(圆括号)
(2).RewriteCond反向引用:
%N (N表示序号,N=1~9 引用当前若干RewriteCond条件中最后符合的条件中的分组成分(圆括号!)。
(3).RewriteMap扩展 :
${mapname:key|default}
(4).服务器变量: %{NAME_OF_VARIABLE}
NAME_OF_VARIABLE可以是下表列出的字符串之一:

**************************
HTTP头 |
**************************
HTTP_USER_AGENT |
HTTP_REFERER |
HTTP_COOKIE |
HTTP_FORWARDED |
HTTP_HOST |
HTTP_PROXY_CONNECTION |
HTTP_ACCEPT |
**************************
连接与请求 |
**************************
REMOTE_ADDR |
REMOTE_HOST |
REMOTE_PORT |
REMOTE_USER |
REMOTE_IDENT |
REQUEST_METHOD |
SCRIPT_FILENAME |
PATH_INFO |
QUERY_STRING |
AUTH_TYPE |
**************************
服务器自身 |
**************************
DOCUMENT_ROOT |
SERVER_ADMIN |
SERVER_NAME |
SERVER_ADDR |
SERVER_PORT |
SERVER_PROTOCOL |
SERVER_SOFTWARE |
**************************
日期和时间 |
**************************
TIME_YEAR |
TIME_MON |
TIME_DAY |
TIME_HOUR |
TIME_MIN |
TIME_SEC |
TIME_WDAY |
TIME |
**************************
其它 |
**************************
API_VERSION |
THE_REQUEST |
REQUEST_URI |
REQUEST_FILENAME |
IS_SUBREQ |
HTTPS |
**************************

这些变量都对应于类似命名的HTTP MIME头、Apache服务器的C变量、Unix系统中的struct tm字段,
其中的大多数在其他的手册或者CGI规范中都有说明

2.CondPattern参数
CondPattern是条件模式,即一个应用于当前TestString实例的正则表达式。TestString将被首先计算,然后再与CondPattern匹配。
(1).可以在CondPattern串的开头使用'!'(惊叹号)来指定不匹配。
(2).CondPatterns有若干特殊的变种。除了正则表达式的标准用法,还有下列用法:
'将CondPattern视为纯字符串,与TestString按词典顺序进行比较。如果TestString小于CondPattern则为真。
'>CondPattern'(词典顺序的大于)
将CondPattern视为纯字符串,与TestString按词典顺序进行比较。如果TestString大于CondPattern则为真。
'=CondPattern'(词典顺序的等于)
将CondPattern视为纯字符串,与TestString按词典顺序进行比较。如果TestString等于CondPattern(两个字符串逐个字符地完全相等)则为真。如果CondPattern是""(两个双引号),则TestString将与空字符串进行比较。
'-d'(目

录)
将TestString视为一个路径名并测试它是否为一个存在的目录。
'-f'(常规文件)
将TestString视为一个路径名并测试它是否为一个存在的常规文件。
'-s'(非空的常规文件)
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
'-l'(符号连接)
将TestString视为一个路径名并测试它是否为一个存在的符号连接。
'-x'(可执行)
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
'-F'(对子请求存在的文件)
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
'-U'(对子请求存在的URL)
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!

注意

所有这些测试都可以用惊叹号作前缀('!')以实现测试条件的反转。

exp:
将chrome首页跳到index1.php ,Firefox首页跳到index2.php ,Ie跳到index3.php:
RewriteCond %{HTTP_USER_AGENT} Mozilla.*.Chrome.* [NC]
RewriteRule ^$|^index. index1.php [NC,L]
RewriteCond %{HTTP_USER_AGENT} Mozilla.*.Firefox.* [NC]
RewriteRule ^$|^index. index2. php [NC,L]
RewriteCond %{HTTP_USER_AGENT} Mozilla.*.MSIE.* [NC]
RewriteRule ^$|^index. index3.php [L]
------------------------------------------------------------------------------------------------------------------
6. RewriteMap 指令
说明
定义用于关键词查找的映射函数
语法
RewriteMap MapName MapType:MapSource
作用域
server config, virtual host
RewriteEngine on|off #on开启,#off关闭所有rewrite指定
NOTE:
RewriteMap指令作用域是server config, virtual host,不能够用在.htaccess
RewriteMap指令定义了一个映射表(Rewriting Map),映射函数将使用该表来查找关键字然后插入/替换
字段。此查找操作的源可以是多种类型。
*************************************************************************************
1.MapName 参数
是映射表的名称,指定了一个映射函数,用于重写规则的字符串替换
2.MapType 参数
--------------------------------------------------------------
txt | 标准纯文本
--------------------------------------------------------------
rnd | 随机纯文本
--------------------------------------------------------------
dbm | 散列文件
--------------------------------------------------------------
int | 内部函数
--------------------------------------------------------------
| toupper:转换查找关键词为大写
| tolower:转换查找关键词为小写
| escape:转换查找关键词中的特殊字符为十六进制编码
| ?:转

换查找关键词中的十六进制编码为特殊字符
--------------------------------------------------------------
prg | 外部重写程序
--------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------

相关文档
最新文档