RewriteCond指令格式

【说明】定义重写发生的条件
【语法】RewriteCond TestString CondPattern [flags]

RewriteCond指令定义一条规则条件。在一条RewriteRule指令前面可能会有一条或多条RewriteCond指令,只有当RewriteCond的条件(CondPattern)匹配成功时,RewriteRule的重写规则才被应用于当前URL处理。

TestString是一个纯文本的字符串,除了包含普通的字符外,还可以包括下列的变量结构扩展:

RewriteMap扩展:引用方法是:${mapname:key|default}
细节请参见RewriteMap指令 。

TestString可以包含服务器变量 ,引用方法是:%{NAME_OF_VARIABLE}

NAME_OF_VARIABLE可以是下表列出的字符串之一:

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

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

IS_SUBREQ

如果正在处理的请求是一个子请求,它将包含字符串”true”,否则就是”false”。
模块为了解析URI中的附加文件,可能会产生子请求。

API_VERSION

这是正在使用中的Apache模块API(服务 器和模块之间内部接口)的版本, 其定义位于include/ap_mmn.h中。
此模块API版本对应于正在使用的Apache的版本(比如在Apache 1.3.14的发行版中这个值是19990320:10)。
通常,对它感兴趣的是模块的开发者。

THE_REQUEST

这是由浏览器发送的完整的HTTP请求行(比如:”GET /index.html HTTP/1.1″)。
它不包含任何浏览器发送的其它头信息。

REQUEST_URI

这是在HTTP请求行中所请求的资源(比如上述例子中的”/index.html”)。

REQUEST_FILENAME

这是与请求相匹配的完整的本地文件系统的文件路径名。

HTTPS

如果连接使用了SSL/TLS,它将包含字符串”on”,否则就是”off”(无论mod_ssl
是否已经加载,该变量都可以安全的使用)。

其它注意事项:

SCRIPT_FILENAME和
REQUEST_FILENAME包含的值是相同的——即Apache服务器内部的request_rec结构中的 filename字段。
第一个就是大家都知道的CGI变量名,而第二个则是REQUEST_URI(request_rec结构中的uri字段)的一个副本。

  1. 特殊形式:%{ENV:variable} ,其中的variable可以是任意环境变量。
    它是通过查找Apache内部结构或者(如果没找到的话)由Apache服务器进程通过getenv()得到的。
  2. 特殊形式:%{SSL:variable} ,其中的variable可以是一个SSL环境变量 的名字,无论mod_ssl
    模块是否已经加载都可以使用(未加载时为空字符串)。
    比如:%{SSL:SSL_CIPHER_USEKEYSIZE}将会被替换为128。
  3. 特殊形式:%{HTTP:header} ,其中的header可以是任意HTTP MIME头的名称。
    它总是可以通过查找HTTP请求而得到。
    比如:%{HTTP:Proxy-Connection}将被替换为Proxy-Connection:HTTP头的值。
  4. 预设形式:%{LA-U:variable} ,variable的最终值在执行一个内部(基于URL的)子请求后确定。
    当需要使用一个目前未知但是会在之后的过程中设置的变量的时候,就可以使用这个方法。
    例如,需要在服务器级配置(httpd.conf文件)中根据REMOTE_USER变量进行重写,
    就必须使用%{LA-U:REMOTE_USER}。 因为此变量是由URL重写(mod??_rewrite)步骤之后的认证步骤设置的。
    但是另一方面,因为mod_rewrite是通过API修正步骤来实现目录级(.htaccess文件)配置的,
    而认证步骤先于API修正步骤,所以可以用%{REMOTE_USER}。
  5. 预设形式:%{LA-F:variable} ,variable的最终值在执行一个内部(基于文件名的)子请求后确定。
    大多数情况下和上述的LA-U是相同的。

●CondPattern是条件模式,即一个应用于当前TestString实例的正则表达式。TestString将被首先计算,然后再与CondPattern匹配。

注意:CondPattern是一个perl兼容的正则表达式,但是还有若干增补:

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,而且可以在服务器当前的访问控制配置下被访问。
它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
注意: 所有这些测试都可以用惊叹号作前缀(“!”)以实现测试条件的反转。

●在CondPattern之后追加特殊的标记[flags]
作为RewriteCond指令的第三个参数。flags是一个以逗号分隔的以下标记的列表:

“nocase|NC”—————(忽略大小写)

它使测试忽略大小写,扩展后的TestString和CondPattern中’AZ’ 和’a-z’是没有区别的。
此标记仅用于TestString和CondPattern的比较,而对文件系统和子请求的检查不起作用。
“ornext|OR”—————(或下一条件)

代码简写 全写 解释
R[=code]  redirect 强制外部重定向
F  forbidden 禁用URL,返回403HTTP状态码。
G  gone 强制URL为已废弃的
P  proxy 强制使用代理转发。
L  last 表明当前规则是最后一条规则,停止分析以后规则的重写。
N  next 重新从第一条规则开始运行重写过程。
C  chain 与下一条规则关联
如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。
T=MIME-type  type 强制MIME类型
NS  nosubreq 只用于不是内部子请求
NC  nocase 不区分大小写
QSA  qsappend 追加请求字符串
NE  noescape 不在输出转义特殊字符
PT  passthrough 传递给下一个处理
S=num  skip 跳过num条规则
E=VAR:VAL  env 设置环境变量
CO=NAME:VAL:domain[:lifetime[:path]]  cookie 设置cookie

redirect|R [=code] (强制重定向
redirect)

以 http://thishost[:thisport]/(使新的URL成为一个URI)
为前缀的Substitution可以强制性执行一个外部重定向。 如果code没有指定,则产生一个HTTP响应代码302(临时性移动)。
如果需要使用在300-400范围内的其他响应代码,只需在此指定这个数值即可, 另外,还可以使用下列符号名称之一: temp
(默认的), permanent, seeother. 用它可以把规范化的URL反馈给客户端,如, 重写“/~”为
“/u/”,或对/u/user加上斜杠,等等。

注意: 在使用这个标记时,必须确保该替换字段是一个有效的URL! 否则,它会指向一个无效的位置!
并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/的前缀,重写操作仍然会继续。
通常,你会希望停止重写操作而立即重定向,则还需要使用’L’标记.

forbidden|F (强制URL为被禁止的
forbidden)

强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。
使用这个标记,可以链接若干RewriteConds以有条件地阻塞某些URL。

gone|G’(强制URL为已废弃的 gone)

强制当前URL为已废弃的,即,立即反馈一个HTTP响应代码410(已废弃的)。
使用这个标记,可以标明页面已经被废弃而不存在了.

proxy|P (强制为代理 proxy)

此标记使替换成分被内部地强制为代理请求,并立 即(即, 重写规则处理立即中断)把处理移交给代理模块。
你必须确保此替换串是一个有效的(比如常见的以 http://hostname开头的)能够为Apache代理模块所处理的URI。
使用这个标记,可以把某些远程成分映射到本地服务器名称空间
从而增强了ProxyPass指令的功能。

注意: 要使用这个功能,代理模块必须编译在Apache服务器中。 如果你不能确定,可以检查“httpd
-l”的输出中是否有mod_proxy.c。 如果有,则mod_rewrite可以使用这个功能;
如果没有,则必须启用mod_proxy并重新编译“httpd”程序。

last|L (最后一个规则 last)

立即停止重写操作,并不再应用其他重写规则。 它对应于Perl中的last命令或C语言中的break命令。
这个标记可以阻止当前已被重写的URL为其后继的规则所重写。 举例,使用它可以重写根路径的URL(’/’)为实际存在的URL, 比如,
‘/e/www/’.

next|N (重新执行 next round)

重新执行重写操作(从第一个规则重新开始). 这时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理的URL。
它对应于Perl中的next命令或C语言中的continue命令。 此标记可以重新开始重写操作,即, 立即回到循环的头部。
但是要小心,不要制造死循环!

chain|C (与下一个规则相链接
chained)

此标记使当前规则与下一个(其本身又可以与其后 继规则相链接的, 并可以如此反复的)规则相链接。 它产生这样一个效果:
如果一个规则被匹配,通常会继续处理其后继规则, 即,这个标记不起作用;如果规则不能被匹配,
则其后继的链接的规则会被忽略。比如,在执行一个外部重定向时, 对一个目录级规则集,你可能需要删除“.www”
(此处不应该出现“.www”的)。

type|T=MIME-type(强制MIME类型
type)

强制目标文件的MIME类型为MIME-type。 比如,它可以用于模拟mod_alias中的ScriptAlias指令,
以内部地强制被映射目录中的所有文件的MIME类型为“application/x-httpd-cgi”。

nosubreq|NS (仅用于不对内部子请求进行处理 no internal
sub-request)

在当前请求是一个内部子请求时,此标记强制重写 引擎跳过该重写规则。
比如,在mod_include试图搜索可能的目录默认文件(index.xxx)时,
Apache会内部地产生子请求。对子请求,它不一定有用的,而且如果整个规则集都起作用,
它甚至可能会引发错误。所以,可以用这个标记来排除某些规则。

根据你的需要遵循以下原则: 如果你使用了有CGI脚本的URL前缀,以强制它们由CGI脚本处理,
而对子请求处理的出错率(或者开销)很高,在这种情况下,可以使用这个标记。

nocase|NC (忽略大小写 no
case)

它使Pattern忽略大小写,即, 在Pattern与当前URL匹配时,’A-Z’ 和’a-z’没有区别。

qsappend|QSA (追加请求串 query string
append)

此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。
如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。

noescape|NE (在输出中不对URI作转义 no URI
escaping)

此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(如’%’, ‘$’,
‘;’等)会被转义为等值的十六进制编码
此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,如:

RewriteRule /foo/(.*) /bar?arg=P1\=$1 [R,NE]
可以使’/foo/zed’转向到一个安全的请求’/bar?arg=P1=zed’.

passthrough|PT (移交给下一个处理器 pass
through)

此标记强制重写引擎将内部结构 request_rec中的uri字段设置为
filename字段的值,它只是一个小修改,使之能对来自其他URI到文件名翻译器的 Alias,ScriptAlias,
Redirect 等指令的输出进行后续处理。举一个能说明其含义的例子:
如果要通过mod_rewrite的重写引擎重写/abc为/def,
然后通过mod_alias使/def转变为/ghi,可以这样:

RewriteRule ^/abc(.*) /def$1 [PT]Alias /def /ghi

如果省略了PT标记,虽然mod_rewrite运作正常, 即, 作为一个使用API的URI到文件名翻译器,
它可以重写uri=/abc/…为filename=/def/…,
但是,后续的mod_alias在试图作URI到文件名的翻译时,则会失效。

注意: 如果需要混合使用不同的包含URI到文件名翻译器的模块时, 就必须使用这个标记。。
混合使用mod_alias和mod_rewrite就是个典型的例子。

For Apache hackers

如果当前Apache API除了URI到文件名hook之外,还有一个文件名到文件名的hook, 就不需要这个标记了!
但是,如果没有这样一个hook,则此标记是唯一的解决方案。 Apache Group讨论过这个问题,并在Apache 2.0
版本中会增加这样一个hook。

skip|S=num (跳过后继的规则
skip)

此标记强制重写引擎跳过当前匹配规则后继的num个规则。 它可以实现一个伪if-then-else的构造:
最后一个规则是then从句,而被跳过的skip=N个规则是else从句. (它和’chain|C’标记是不同的!)

env|E=VAR:VAL (设置环境变量 environment
variable)

此标记使环境变量VAR的值为VAL, VAL可以包含可扩展的反向引用的正则表达式$N和%N。 此标记可以多次使用以设置多个变量。
这些变量可以在其后许多情况下被间接引用,但通常是在XSSI (via ) or CGI (如
$ENV{’VAR’})中, 也可以在后继的RewriteCond指令的pattern中通过%{ENV:VAR}作引用。
使用它可以从URL中剥离并记住一些信息。

cookie|CO=NAME:VAL:domain[:lifetime[:path]]
(设置cookie)

它在客户端浏览器上设置一个cookie。 cookie的名称是NAME,其值是VAL。
domain字段是该cookie的域,比如’.apache.org’, 可选的lifetime是cookie生命期的分钟数,
可选的path是cookie的路径。

●举例说明RewriteCond命令规则

RewriteCond %{REMOTE_HOST} ^andelse.com [OR]
RewriteCond %{REMOTE_HOST} ^*.andelse.com
RewriteRule …针对这2个主机的规则集

RewriteCond % { HTTP_USER_AGENT }  ^Mozilla.*
RewriteRule ^/$ /homepage. max .html  [ L ]
如果你使用的浏览器识别标志是’Mozilla’,则你将得到内容最大化的主页homepage. max
.html(含有Frames等等)。

RewriteRule指令格式

【说明】定义重写的规则
【语法】RewriteRule Pattern rewritePattern [flags]

RewriteRule指令,可以定义一条重写
规则,规则间的顺序非常重要。对Apache1.2及以后的版本,模板(Pattern)是一个POSIX正则式,用以匹配当前的URL。当前的URL不
一定是最初提交的URL,因为可能用一些规则在此规则前已经对URL进行了处理。rewritePattern
大多数文章写为Substitution ,这里为了更清楚的认识故写为rewritePattern 。

●Pattern 可以使用如下特殊匹配規則,如php等其他語言類似。

“.” ——————- 换行符以外的所有字符
“\w” —————- 匹配字母或数字或下划线或汉字
“\s” —————– 匹配任意的空白符
“\d” —————– 匹配数字
“\b” —————– 匹配单词的开始或结束
“^” —————— 匹配字符串的开始
“$” —————— 匹配字符串的结束
“*” —————— 重复零次或更多次
“+” —————— 重复一次或更多次
“?” ——————- 重复零次或一次
“{n}” —————- 重复n次
“{n,}” ————— 重复n次或更多次
“{n,m}” ————- 重复n到m次
“[0-9]” ————– 匹配单个数字

rewritePattern 是针对Pattern 匹配后的URL进行rewritePattern
规定的替换。应用替换时,前面Pattern 第一个()中匹配的内容后面rewritePattern
就可以用$1引用,第二个()中匹配的就用$2应用……以此类推。

●在rewritePattern 之后追加特殊的标记[flags] 作为RewriteRule
指令的第三个参数。flags可以使用的标记,和上面RewriteCond使用的一样

●举例说明RewriteRule语法

RewriteRule index.html index.php

比如:http://www.andelse.cn/index.html  ->
http://www.andelse.cn/index.php

RewriteRule ^test([0-9]*).html$ test.php?id=$1

比如:http://www.andelse.cn/test8.html  ->
http://www.andelse.cn/test.php?id=8

RewriteRule ^cat-([0-9]+)-([0-9]+)\.html$
cat.php?id1=$1&id2=$2

比如:http://www.andelse.cn/cat-1-3.html ->
http://www.andelse.cn/cat.php?id1=1&id2=3

RewriteRule ^cat-([a-zA-Z0-9\-]*)-([0-9]+)-([0-9]+)\.html$
cat.php?id0=$1&id1=$2&id2=$3

比如:http://www.andelse.cn/cat-zbc2ac-3-5.html ->
http://www.andelse.cn/cat.php?id0=zbc2ac&id1=3&id2=5

RewriteRule ^cat1-([0-9]+)-([0-9]+)-([0-9]+)\.html$
cat1.php?id1=$1&id2=$2&id3=$3

比如:http://www.andelse.cn/cat1-4-3-8.html ->
http://www.andelse.cn/cat1.php?id1=4&id2=3&id3=8

RewriteRule ^cat([0-9]*)/$ cat.php?id1=$1

比如:http://www.andelse.cn/cat5/ ->
http://www.andelse.cn/cat.php?id1=5

RewriteRule ^catm([0-9]*)/([0-9]*)/$ catm.php?id1=$1&id2=$2

比如:http://www.andelse.cn/catm6/3/ ->
http://www.andelse.cn/catm.php?id1=6&id2=3

RewriteRule参数的更多相关文章

  1. apache url rewrite 的RewriteRule参数详解

    apache url rewrite 的RewriteRule参数详解 我们经常会在apache那边对一些url进行一些重写操作,那么就会涉及到很多的重写策略的选择,比如重定向的方式,参数的处理,规则 ...

  2. Apache中 RewriteRule 规则参数介绍

    Apache中 RewriteRule 规则参数介绍 摘要: Apache模块 mod_rewrite 提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求.它支持每个完整规则可以拥有不限数量 ...

  3. htaccess文件中RewriteRule 规则参数介绍

    .htaccess 文件 <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d Rew ...

  4. .htaccess语法之RewriteCond与RewriteRule指令格式详细解释

    htaccess语法之RewriteCond与RewriteRule指令格式详细解释 (2012-11-09 18:09:08) 转载▼ 标签:  htaccess it 分类: 网络 上文htacc ...

  5. .htaccess 基础教程(四)Apache RewriteCond 规则参数

    Apache模块 mod_rewrite 提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求.它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制.此UR ...

  6. rewrite规则中参数多于9个的处理方式 apache nginx

    RewriteRule ^index-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)(.*)$ $9&a ...

  7. Apache RewriteRule

    1.Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基 于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式.如果要想用到rewrite模块 ...

  8. apache配置文件参数优化

    1.CentOS5.8 x86_64位 采用最小化安装,系统经过了基本优化篇2.apache版本:httpd-2.2.293.源码包存放位置:/home/oldboy/tools4.源码包编译安装位置 ...

  9. .htaccess语法中RewriteCond和RewriteRule意义

    今天看了301重定向设置的方法,对网站的首页权重有较重要意义.于是看了别人写的.htaccess文件发现一头雾水,于是查了一些资料来进一步理解. RewriteCond语法 RewriteCond T ...

随机推荐

  1. YII的关联查询

    先看数据表中的关系是怎样的: customer表中的关系如下: order中的表为: 先在customer中获得order的数据,并与之关联,在 helloController.php 中,代码如下 ...

  2. 【Todo】【转载】Spark学习 & 机器学习(实战部分)-监督学习、分类与回归

    理论原理部分可以看这一篇:http://www.cnblogs.com/charlesblc/p/6109551.html 这里是实战部分.参考了 http://www.cnblogs.com/shi ...

  3. Eclipse下导入外部jar包的3种方式 (zhuan)

    http://blog.csdn.net/mazhaojuan/article/details/21403717 ******************************************* ...

  4. python语法笔记(一)

    1. python中多个函数或者类定义可以放在一个.py 文件中,视为一个模块.模块的.py文件中,一般要写 if __name__ == '__mian__' 用来单独执行该模块内的某些函数. 2. ...

  5. html 实体 => htmlspecialchars

    因为没有办法判断用户输入的数据是否安全, 可能含有和sql语句相冲突的字符,比如 '  " < >,那就有一个办法, 把这些特殊字符处理一下,比如吧空格符号变成 ,这样sql语句 ...

  6. OpenCV C++ 计算文件夹中对象文件数目及批量处理后保存到txt文件

    //采用windows控制台实现计算文件夹中对象总数以及批量读取对象 //#include <afx.h> //和windows.h是一样的作用 #include <opencv2/ ...

  7. ListView 滚回顶部

    setSelection(0) listView.setSelectionAfterHeaderView(); list.smoothScrollToPosition(0);

  8. const修饰指针

    关于const修饰指针的情况,一般分为如下4种情况: ; const int *a =&b; //情况1 int const *a =&b; //情况2 int* const a =& ...

  9. easyui中对于dialog页面传值的接收

    dialog的功能是将B页面嵌入至A页面,这样,A页面作为B页面的父容器,所有的元素均可以被B页面访问 那么问题来了:我怎么获取B页面的链接参数呢? 其实很简单,只要找到B页面的存放容器即可: 代码如 ...

  10. jmeter 建立一个网络服务的测试计划

    如何创建一个 测试计划 测试一个网络服务. 你会 创建5个用户发送请求到一页. 同时,你会告诉用户运行测试两次. 的总数 请求用户请求(5)x(1)x(重复2次)= 10 HTTP请求. 来 建立测试 ...