首页 > 开发 > Apache > 正文

Apache中RewriteCond指令详解

2019-10-13 18:36:41
字体:
来源:转载
供稿:网友

在 Apache中应用mod_rewrite时,我们往往需要对.htaccess文件进行重写规则的定义,而RewriteCond指令定义了重写规则生效的条件,即在一个RewriteRule指令之前可以有一个或多个RewriteCond指令。条件之后的重写规则仅在当前URI与Pattern匹配并且满足此处的条件时才会起作用。不难发现,RewriteCond指令和PHP中的if语句的条件表达式十分类似。

RewriteCond指令的定义

说明 定义重写发生的条件
语法 RewriteCond TestString CondPattern [flags]
作用域 server config, virtual host, directory, .htaccess
覆盖项 FileInfo
状态 扩展(E)
模块 mod_rewrite

可以看出,RewriteCond指令定义了重写规则生效的条件,整个RewriteCond语句的意思就是:某个测试字符串(TestString)如果满足了条件模式(CondPattern),则进行其后的RewriteRule

RewriteCond指令的TestString

TestString是一个纯文本的(测试)字符串,,但是还可以包含下列可扩展的成分:

1,RewriteRule反向引用,引用方法是:

$N(0<= N<= 9)引用当前(带有若干RewriteRule指令的)RewriteCond中的与Pattern匹配的分组成分(正则表达式中的子模式)。

2,RewriteCond反向引用,引用方法是:

%N(1<= N<=9)引用当前若干RewriteCond条件中最后符合的条件中的分组成分(正则表达式中的子模式)。

3,服务器变量 ,引用方法是:

%{NAME_OF_VARIABLE}

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

HTTP头 连接与请求  

HTTP_USER_AGENTHTTP_REFERER

HTTP_COOKIE

HTTP_FORWARDED

HTTP_HOST

HTTP_PROXY_CONNECTION

HTTP_ACCEPT

REMOTE_ADDRREMOTE_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规范中都有说明。

RewriteCond指令的condPattern

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

可以在CondPattern串的开头使用'!'(惊叹号)来指定不匹配。

CondPatterns是一个perl兼容的正则表达式,有若干特殊的变种。除了正则表达式的标准用法,还有下列若干增补用法:

1,'<CondPattern'(词典顺序的小于)将CondPattern视为纯字符串,与TestString按词典顺序进行比较。如果TestString小于CondPattern则为真。

2,'>CondPattern'(词典顺序的大于)将CondPattern视为纯字符串,与TestString按词典顺序进行比较。如果TestString大于CondPattern则为真。

3,'=CondPattern'(词典顺序的等于)将CondPattern视为纯字符串,与TestString按词典顺序进行比较。如果TestString等于 CondPattern(两个字符串逐个字符地完全相等)则为真。如果CondPattern是""(两个双引号),则TestString将与空字符串进行比较。

4,'-d'(目录)将TestString视为一个路径名并测试它是否为一个存在的目录。

5,'-f'(常规文件)将TestString视为一个路径名并测试它是否为一个存在的常规文件。

6,'-s'(非空的常规文件)将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。

7,'-l'(符号连接)将TestString视为一个路径名并测试它是否为一个存在的符号连接。

8,'-x'(可执行)将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。

9,'-F'(对子请求存在的文件)检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!

10,'-U'(对子请求存在的URL)检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!

注意:所有这些测试都可以用惊叹号作前缀('!')以实现测试条件的反转,并且还可以在CondPattern之后追加特殊的标记[flags]作为RewriteCond指令的第三个参数。

RewriteCond指令的flags

flags是一个以逗号分隔的以下标记的列表:

1,'nocase|NC'(忽略大小写):它使测试忽略大小写,扩展后的TestString和CondPattern中'A-Z' 和'a-z'是没有区别的。此标记仅用于TestString和CondPattern的比较,而对文件系统和子请求的检查不起作用。

2,'ornext|OR'(或下一条件):它以OR方式组合若干规则的条件,而不是隐含的AND。

RewriteCond实例

RewriteCond %{REMOTE_HOST} ^host1.* [OR]

RewriteCond %{REMOTE_HOST} ^host2.* [OR]

RewriteCond %{REMOTE_HOST} ^host3.*

RewriteRule ... 针对这3个主机的规则集 ...

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表