此文章仅对作者认为常用的选项进行了解释
表达式:RewriteCond Syntax: RewriteCond TestString CondPattern [flags]
TestString源串
配置文件目录:/etc/apache2/apache2.conf
TestString一般使用%{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,如 GET /aaa HTTP/1.1 REQUEST_URI——请求虚拟地址,即host后面的部分 REQUEST_FILENAME——请求指向的本地文件名 IS_SUBREQ——是否是子请求 HTTPS——是否开启https(开启时值为 on ) |
CondPattern模式串(匹配模板)
可以用正则表达式,简介:
字符 | 含义 |
---|---|
特殊字符转义成本身 | |
. | 代替任意字符 |
() | 中间包含的视为一个整体 |
| | 二选一 |
* | 前面的字符/块 出现0+ 次 |
+ | 前面的字符/块 出现1+ 次 |
^ | 匹配开头 |
$ | 匹配结尾 |
? | 非贪婪式匹配或者前面的字符/块 出现0/1 次 |
不在表中的指定字符可以不用转义字符直接使用
不匹配开头结尾时可以从任意处开始,任意处结束
补充:
- 可以在模板串前增加一个 ! 前缀,以用表示不匹配模板。但并不是所有的 test 都可以加!前缀。
- CondPattern 中可以使用以下特殊变量:
- '<condpattern' (="" 小于,基于字母顺序="" )="" 将="" condpattern="" 当作一个普通字符串,将它和="" teststring="" 进行比较,当="" 的字符小于="" 为真="" .="" o="" '="">CondPattern' ( 大于 ) 将 condPattern 当作一个普通字符串,将它和 TestString 进行比较,当 TestString 的字符大于 CondPattern 为真 .
- '=CondPattern' ( 等于 ) 将 condPattern 当作一个普通字符串,将它和 TestString 进行比较,当 TestString 与 CondPattern 完全相同时为真 . 如果 CondPattern 只是 "" ( 两个引号紧挨在一起 ) 此时需 TestString 为空字符串方为真 .
- '-d' ( 是否为目录 ) 将 testString 当作一个目录名,检查它是否存在以及是否是一个目录 .
- '-f' ( 是否是 regular file) 将 testString 当作一个文件名,检查它是否存在以及是否是一个 regular 文件 .
- '-s' ( 是否为长度不为 0 的 regular 文件 ) 将 testString 当作一个文件名,检查它是否存在以及是否是一个长度大于 0 的 regular 文件
- '-l' ( 是否为 symbolic link) 将 testString 当作一个文件名,检查它是否存在以及是否是一个 symbolic link.
- '-F' ( 通过 subrequest 来检查某文件是否可访问 ) 检查 TestString 是否是一个合法的文件,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部 subrequest 完成的 , 因此需要小心使用这个功能以降低服务器的性能。
- '-U' ( 通过 subrequest 来检查某个 URL 是否存在 ) 检查 TestString 是否是一个合法的 URL ,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部 subrequest 完成的 , 因此需要小心使用这个功能以降低服务器的性能。
flags是第三个参数,多个标志之间用逗号分隔。
-
'nocase|NC' ( 不区分大小写 ) 在扩展后的 TestString 和 CondPattern 中,比较时不区分文本的大小写。注意,这个标志对文件系统和 subrequest 检查没有影响 .
-
'ornext|OR' ( 建立与下一个条件的或的关系 ) 默认的情况下,二个条件之间是 AND 的关系,用这个标志将关系改为 OR 。例如:
RewriteCond %{REMOTE_HOST} ^host1.* [OR] RewriteCond %{REMOTE_HOST} ^host2.* [OR] RewriteCond %{REMOTE_HOST} ^host3.* RewriteRule ...
如果没有 [OR] 标志,需要写三个条件 / 规则 .
-
'last|L'(表示当前规则是最后一条规则),停止分析以后规则的重写。该标志的使用频率非常高。例如:
RewriteCond %{REQUEST_URI} !index.php RewriteRule ^(.*) index.php?req=$1 [L]
-
'redirect|R' (进行重定向), 状态码在300-399里都可以, 默认是 302 重定向.通常和标志L一起使用. 使用模式: [R[=302]],302表示临时跳转,301表示永久重定向
文件系统
(files|directory|location)(match)?
上面这个表达式即即files|directory|location|filesmatch|directorymatch|locationmatch
首先,match表示开启正则
location匹配请求的虚拟地址(即host后面的部分)
directory匹配请求对应的本地地址(意思上相当于DocumentRoot/Location)
files用在directory里面,只保留目录下的相对路径,详见例子3
优先级:下层目录>上层目录,具体目录>通配符
例子们
- 根据客户端浏览器的不同,返回不同的首页面。
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.* RewriteRule ^/$ /homepage.max.html [L] RewriteCond %{HTTP_USER_AGENT} ^Lynx.* RewriteRule ^/$ /homepage.min.html [L] RewriteRule ^/$ /homepage.std.html [L]
引用资料:
Apache conf配置中的Order说明——海龙
Apache中 RewriteCond 规则参数介绍——clearriver