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]
用.htaccess文件的话:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^mydomain.com [NC]
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [L,R=301]
RewriteCond %{HTTP_HOST} ^mydomain.com [NC]
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [L,R=301]