关于RewriteCond的内容

关于RewriteCond的内容 RewriteCond Syntax:RewriteCondTestStringCondPattern[flags]   RewriteCond指令定义一条规则条件。在一条RewriteRule指令前面可能会有一条或多条RewriteCond指令,只有当自身的模板(pattern)匹配成功且这些条件也满足时规则才被应用于当前URL处理。   TestString是一个字符串,除了包

大家好,又见面了,我是你们的朋友全栈君。

 

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]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134128.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是缓存雪崩、击穿、穿透?

    什么是缓存雪崩、击穿、穿透?什么是缓存雪崩、击穿、穿透?用户的数据一般都是存储于数据库,数据库的数据是落在磁盘上的,磁盘的读写速度可以说是计算机里最慢的硬件了。当用户的请求,都访问数据库的话,请求数量一上来,数据库很容易就奔溃的了,所以为了避免用户直接访问数据库,会用Redis作为缓存层。因为Redis是内存数据库,我们可以将数据库的数据缓存在Redis里,相当于数据缓存在内存,内存的读写速度比硬盘快好几个数量级,这样大大提高了系统性能。引入了缓存层,就会有缓存异常的三个问题,分别是缓存雪崩、缓存击穿、缓存穿透。

    2022年6月24日
    20
  • SIGPIPE信号问题

    SIGPIPE信号问题
    socket编程问题
    SIGPIPE信号问题=========================
    当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。
       根据信号的默认处理规则SIGPIPE信号的默认执行动作是terminate(终止、退出),所以client会退出。若不想客户端退出可以把SIGP

    2022年5月29日
    29
  • android实现点餐功能「建议收藏」

    android实现点餐功能「建议收藏」近期项目中有点餐功能要求中午和晚上一起点餐,中午和晚上的餐品加载的都是一样的有炒菜和面点废话不多说直接上代码activity页面代码:publicclassAnimationActivityextendsBaseActivityimplementsView.OnClickListener{privateListViewrecyclerView;privateImag…

    2022年6月19日
    23
  • php用哪个版本_php什么版本好

    php用哪个版本_php什么版本好一. PHP5.2、5.3、5.4、5.5、5.6版本区别对比以及新功能详解1.php5.2以前1.1autoload的使用;当在代码中使用一个未定义的类的时候,该函数就会被调用

    2022年8月2日
    3
  • 打开虚拟机时出现不能为虚拟电脑打开一个新任务「建议收藏」

    打开虚拟机时出现不能为虚拟电脑打开一个新任务「建议收藏」标题:打开虚拟机时出现不能为虚拟电脑打开一个新任务在用虚拟机打开Ubuntu时出现以下情况解决方法在查找了许多有关资料试用无效后,最终用以下两个步骤解决了该问题1.打开VirtualBox安装文件夹里的\drivers\vboxdrv文件夹2.右键VBoxDrv.inf文件,点击安装;3.安装完成后重启VirtualBox。参考文章在参照该作者成功打开一次后续仍然出现原问题后续发现应该是权限问题每次打开必须用管理员身份,直接双击是不可以的。这样问题就解决啦。…

    2025年6月18日
    0
  • format(format c)

    a-antemeridiemandpostmeridiemd-dayofmonth(noleadingzero)dd-dayofmonth(twodigit)o-dayofyear(noleadingzeros)oo-dayofyear(threedigit)D-daynameshortDD-…

    2022年4月10日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号