将CondPattern视为纯字符串,与TestString以词典顺序相比较.
如果按词典顺序,TestString等于CondPattern,则为真,即,
两个字符串(逐个字符地)完全相等。如果CondPattern只是""(两个引号), 则TestString将与空串相比较.
'-d' (是一个目录[directory])
将TestString视为一个路径名并测试它是否存在而且是一个目录.
'-f' (是一个常规的文件[file])
将TestString视为一个路径名并测试它是否存在而且是一个常规的文件.
'-s' (是一个非空的常规文件[size])
将TestString视为一个路径名并测试它是否存在而且是一个尺寸大于0的常规的文件.
'-l' (是一个符号连接[link])
将TestString视为一个路径名并测试它是否存在而且是一个符号连接.
'-F' (对子请求有效的业已存在的文件)
测试TestString是否一个有效的文件, 而且可以被服务器当前已经配置的所有存取控制所存取。 它用一个内部子请求来做判断,由于会降低服务器的性能,请小心使用!
'-U' (对子请求有效的业已存在的URL)
测试TestString是否一个有效的URL, 而且可以被服务器当前已经配置的所有存取控制所存取。 它用一个内部子请求来做判断,由于会降低服务器的性能,请小心使用!
注意
所有这些测试都可以用惊叹号作前缀('!')以实现条件的反转.
另外,还可以为CondPattern追加特殊的标记
[flags]
作为RewriteCond指令的第三个参数。 Flags是一个以逗号分隔的以下标记的列表:
'nocase|NC' (no case)
它使测试忽略大小写, 即, 扩展后的TestString和CondPattern中, 'A-Z' 和'a-z'是没有区别的。此标记仅作用于TestString和CondPattern的比较, 而对文件系统和子请求的测试不起作用。
'ornext|OR' (or next condition)
它以OR方式组合若干规则的条件,而不是隐含的AND。典型的例子如下:
RewriteCond % ^host1.* [OR]
RewriteCond % ^host2.* [OR]
RewriteCond % ^host3.*
RewriteRule ...some special stuff for any of these hosts...
如果不用这个标记,则必须使用三个 条件/规则。
举例:
如果要按请求头中的``User-Agent:'重写一个站点的主页,可以这样写:
RewriteCond % ^Mozilla.*
RewriteRule ^/$ /homepage.max.html [L]
RewriteCond % ^Lynx.*
RewriteRule ^/$ /homepage.min.html [L]
RewriteRule ^/$ /homepage.std.html [L]
含义: 如果你使用的浏览器是Netscape Navigator(其识别标志是'Mozilla'),
则你将得到内容最大化的主页,包括Frames等等;
如果你使用的是(基于终端的)Lynx,则你得到的是内容最小化的主页,不包含tables等等;
如果你使用的是其他的浏览器,则你得到的是一个标准的主页。
RewriteEngine 指令
RewriteEngine指令打开或关闭运行时刻的重写引擎。 如果设置为off,则mod_rewrite模块不执行任何运行时刻的重写操作, 甚至也不更新SCRIPT_URx环境变量。
使用该指令可以使mod_rewrite模块无效,而无须注释所有的RewriteRule指令!
注意:默认情况下,重写配置是不可继承的, 即,必须在每个需要的虚拟主机中设置一个RewriteEngine on指令。
RewriteLock 指令
此指令设置mod_rewrite为了和RewriteMap 程序通讯而使用的一个同步加锁文件的名称。 在需要使用重写映射表程序时,它必须是一个本地路径(而不能是一个NFS挂接设备); 对其他类型的重写映射表,则无此要求。
RewriteLog 指令
RewriteLog指令设置用于记录所有重写操作的文件的名称。 如果此文件名不是以斜杠('/')开头,则它是相对于Server Root的。 此指令应该仅仅出现在服务器级配置中。
如果要关闭对重写操作的记录,不推荐把Filename设置为/dev/null,
因为,虽然重写引擎不能输出记录了,但仍会内部地建立这个日志文件, 它会使服务器速度降低,而且对管理员毫无益处!
要关闭日志,可以删除或注解RewriteLog指令, 或者使用RewriteLogLevel 0!
安全
参见Apache Security Tips,其中讲述了, 为什么如果存放日志的目录对除了启动服务器以外的用户是可写的会带来安全隐患。
举例
RewriteLog "/usr/local/var/apache/logs/rewrite.log"
RewriteLogLevel 指令
RewriteLogLevel指令设置重写引擎日志的详细程度的级别。 默认级别0意味着不记录,而9或更大的值意味着记录所有的操作。
要关闭重写引擎日志,可以简单地设此值为0,关闭所有的重写操作记录。
使用较高的Level值会使Apache服务器速度急剧下降! 重写日志使用大于2的Level值只用于调试!
举例
RewriteLogLevel 3
RewriteMap 指令
RewriteMap定义一个映射表, 由映射函数用于查找关键词来插入/替换字段。此查找操作的源可以是多种类型。
MapName是映射表的名称, 指定了一个映射函数,用于重写规则的字符串替换,它可以是下列形式之一:
${ MapName : LookupKey }
${ MapName : LookupKey | DefaultValue }
如果使用了这样的形式,则会在MapName中查找关键词LookupKey。 如果找到了,则被替换成SubstValue; 如果没有找到,则被替换成DefaultValue, 如果没有指定DefaultValue,则被替换成空字符串。
可以使用下列MapType和MapSource的组合:
标准纯文本
MapType: txt, MapSource: 有效的Unix文件系统文件名
这是重写映射表的标准形式,即, MapSource是一个纯文本文件,包含空行、注释行(以字符'#'打头), 以及每行一个的替换对,如下。
MatchingKey SubstValue
Example
##
## map.txt -- rewriting map
##
Ralf.S.Engelschall rse # Bastard Operator From Hell
Mr.Joe.Average joe # Mr. Average
RewriteMap real-to-user txt:/path/to/file/map.txt
随机纯文本
MapType: rnd, MapSource: 有效的Unix文件系统文件名
这个与上述的标准纯文本很相似,但它有一个特殊的后处理特性: 查找完毕后,会解析其中包含的含义为``or''和``|''符号。
也就是说,会随机地选择其中之一作为实际的返回值。 虽然这看似毫无意义,但它的设计意图是,
在一个查找值是服务器名称的反向代理环境中,实现负载平衡。如:
##
## map.txt -- rewriting map
##
static www1|www2|www3|www4
dynamic www5|www6
RewriteMap servers rnd:/path/to/file/map.txt
散列文件
MapType: dbm[=type], MapSource: 有效的Unix文件系统文件名