RewriteCond Syntax: RewriteCond TestString CondPattern [flags] RewriteCond 指令定义一条规则条件。在一条 RewriteRule 指令前面可能会有一条或多条 RewriteCond 指令,只有当自身的模板 (pattern) 匹配成功且这些条件也满足时规则才被应用于当前 URL 处理。 TestString 是一个字符串,除了包含普通的字符外,还可以包括下列的可扩展结构:
1. $N,RewriteRule 后向引用,其中 (0 <= N <= 9) $N 引用紧跟在 RewriteCond 后面的 RewriteRule 中模板中的括号中的模板在当前 URL 中匹配的数据。
2. %N,RewriteCond 后向引用,其中 (0 <= N <= 9) %N 引用最后一个 RewriteCond 的模板中的括号中的模板在当前 URL 中匹配的数据。
3. ${mapname:key|default},RewriteMap 扩展 . 具体参见 RewriteMap
4. %{ NAME_OF_VARIABLE } , 服务器变量。 变量的名字如下表(分类显示)
HTTP headers: | connection & request: | server internals: | system stuff: |
HTTP_USER_AGENT | REMOTE_ADDR | DOCUMENT_ROOT | TIME_YEAR |
HTTP_REFERER | REMOTE_HOST | SERVER_ADMIN | TIME_MON |
HTTP_COOKIE | REMOTE_USER | SERVER_NAME | TIME_DAY |
HTTP_FORWARDED | REMOTE_IDENT | SERVER_ADDR | TIME_HOUR |
HTTP_HOST | REQUEST_METHOD | SERVER_PORT | TIME_MIN |
HTTP_PROXY_CONNECTION | SCRIPT_FILENAME | SERVER_PROTOCOL | TIME_SEC |
HTTP_ACCEPT | PATH_INFO | SERVER_SOFTWARE | TIME_WDAY |
| QUERY_STRING | | TIME |
| AUTH_TYPE | | |
5.
specials: | 说明 |
API_VERSION | Apache 与模块间的接口的版本号 |
THE_REQUEST | 客户端发送到来的 HTTP 请求行的整行信息,不含其它的头字段信息,如( "GET /index.html HTTP/1.1") |
REQUEST_URI | HTTP 请求行中请求的资源 |
REQUEST_FILENAME | 请求中对应的服务器本地文件系统中全路径文件名 |
IS_SUBREQ | 根据是否为 SubRequest, 分别值为 ”true” 或 ”false” |
6. 特别说明:
o SCRIPT_FILENAME 和 REQUEST_FILENAME 变量含有相同的值,也就是 Apache 服务器内部数据结构 request_rec 的 filename 字段的值。第一个变量是一个 CGI 变量,而第二个则与 REQUEST_URI( 含有 request_rec 数据结构中 uri 字段的值 ) 保持一致。
o %{ENV:variable} 中的 variable 可以是任何环境变量的名字。对其值的查找,先通过 Apache 内部的数据结构,(如找不到)再在 Apache 服务器进程中通过 getenv() 查找。
o %{HTTP:header} 中的 header 可以是任何 HTTP MIME-header 的名字,其值通过查找 HTTP 请求信息而得。
o %{LA-U:variable} 用来引用后续 API 阶段中定义的、当前还不知道的值,具体实现是通过执行一个基于 URL 的内部的 sub-request 来决定的 variable 的最终的值。例如,假如你想在服务器范围内利用 REMOTE_USER 的值来完成重写,但这个值是在验证阶段设置的,而验证阶段是在 URL 转换阶段的后面。从另一方面讲,由于 mod_rewrite 在修补 (fixup)API 阶段进行目录范围的重写,而修补阶段在验证阶段的后面,所以此时只要用 %{REMOTE_USER} 就可以取得该值了。
o %{LA-F:variable} ,执行一个基于文件名字 (filename) 的内部 sub-request 来决定 variable 的最终的值。大多数时间内,这和 LA-U 相同。
CondPattern 是一个条件模板,也就是说,是一个扩展正则式( extended regular expression ),用与跟 TestString 进行匹配。作为一个标准的扩展正则式, CondPattern 有以下补充:
1. 可以在模板串前增加一个 ! 前缀,以用表示不匹配模板。但并不是所有的 test 都可以加!前缀。
2. CondPattern 中可以使用以下特殊变量:
o '<CONDPATTERN' ( 小于,基于字母顺序 ) 将 condPattern 当作一个普通字符串,将它和 TestString 进行比较,当 TestString 的字符小于 CondPattern 为真 .
o '>CondPattern' ( 大于 ) 将 condPattern 当作一个普通字符串,将它和 TestString 进行比较,当 TestString 的字符大于 CondPattern 为真 .
o '=CondPattern' ( 等于 ) 将 condPattern 当作一个普通字符串,将它和 TestString 进行比较,当 TestString 与 CondPattern 完全相同时为真 . 如果 CondPattern 只是 "" ( 两个引号紧挨在一起 ) 此时需 TestString 为空字符串方为真 .
o '-d' ( 是否为目录 ) 将 testString 当作一个目录名,检查它是否存在以及是否是一个目录 .
o '-f' ( 是否是 regular file) 将 testString 当作一个文件名,检查它是否存在以及是否是一个 regular 文件 .
o '-s' ( 是否为长度不为 0 的 regular 文件 ) 将 testString 当作一个文件名,检查它是否存在以及是否是一个长度大于 0 的 regular 文件
o '-l' ( 是否为 symbolic link) 将 testString 当作一个文件名,检查它是否存在以及是否是一个 symbolic link.
o '-F' ( 通过 subrequest 来检查某文件是否可访问 ) 检查 TestString 是否是一个合法的文件,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部 subrequest 完成的 , 因此需要小心使用这个功能以降低服务器的性能。
o '-U' ( 通过 subrequest 来检查某个 URL 是否存在 ) 检查 TestString 是否是一个合法的 URL ,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部 subrequest 完成的 , 因此需要小心使用这个功能以降低服务器的性能。
[flags] 是第三个参数,多个标志之间用逗号分隔。
1. 'nocase|NC' ( 不区分大小写 ) 在扩展后的 TestString 和 CondPattern 中,比较时不区分文本的大小写。注意,这个标志对文件系统和 subrequest 检查没有影响 .
2. 'ornext|OR' ( 建立与下一个条件的或的关系 ) 默认的情况下,二个条件之间是 AND 的关系,用这个标志将关系改为 OR 。例如: RewriteCond %{REMOTE_HOST} ^host1.* [OR] RewriteCond %{REMOTE_HOST} ^host2.* [OR] RewriteCond %{REMOTE_HOST} ^host3.* RewriteRule ... 如果没有 [OR] 标志,需要写三个条件 / 规则 .
例子:根据客户端浏览器的不同,返回不同的首页面。 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] 当你在地址栏里输入 sina.com.cn google.cn
看看有什么变化?是不是会自动跳转到 www.sina.com.cn www.google.cn
这一技术通过apache的rewrite可以实现,当然你得把 不带www的域名指向你服务器的IP
要是虚拟主机的话,得在viralhost段加入 ServerAlias xxx.com
然后打开重写引擎功能
RewriteEngine On
能过rewritecond判断主机名是否带www
RewriteCond %{HTTP_HOST} ^xxx/.com$ [NC]
然后来一条
RewriteRule ^/(.*)$ http://www.xxx.com/$1 [R=301,L]
OK,重起apache,现在在浏览器中输入 xxx.com 看看是不是自动变成了www.xxx.com了呢。
重新整理一下就是:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^xxx/.com$ [NC]
RewriteRule ^/(.*)$ http://www.xxx.com/$1 [R=301,L]