ddddd

RewriteCond与RewriteRule用法

作者:程序员11 时间:2021-10-28 人气:590 QQ交流群\邮箱:1003265987@qq.com
重定向301 参数,RewriteCond与RewriteRule用法
要展示的内容

RewriteRule 里面 $1 $2代表

正则匹配的参数,$1表示第一个()内的正则匹配内容,$2为第二个,以此类推。

例如RewriteRule ^info/S*_c([0-9]+)/([0-9]+).html$ /index.php?m=info&CateId=$1&page=$2 [QSA,L]

$1 代表红色 $2代表绿色


正则的链接:https://www.runoob.com/regexp/regexp-syntax.html


Apache中 RewriteCond语句对于我来说一直是个难点,多次试图去把它搞明白,都没有结构,这次我终于算大概知道它的意思了


RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始、基础的功能,为了方便理解,下面来看看几个例子。


RewriteEngine on

RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla//5/.0.*

RewriteRule  index.php            index.m.php

RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*

RewriteRule  index.php            index.L.php 

RewriteRule  index.php            index.b.php

上面语句的作用是当你是用FF浏览器访问index.php这个文件的时候,会自动让你访问到index.m.php这个文件,当你是用一些移动终端访问的 时候,会让你对index.php这个文件的访问实际访问的是index.L.php去,如果你是用其它的浏览器访问的时候,会让你跳到 index.b.php。在说形象一点,上面的语句就等同于程序里面的下面语句 (依PHP语句为例):

if($_SERVER['HTTP_USER_AGENT'] == 'Mozilla/5.0')

{

//跳转到对index.m.php的访问

}

else if($_SERVER['HTTP_USER_AGENT'] == 'Lynx')

{

//跳转到对index.L.php的访问

}

else

//跳转到对index.b.php的访问



在看例2:

RewriteCond %{HTTP_REFERER} (www.test.cn)

RewriteRule (.*)$ test.php

上面语句的作用是如果你访问的上一个页面的主机地址是www.test.cn,则无论你当前访问的是哪个页面,都会跳转到对test.php的访问。

在看例三:

RewriteCond %{REMOTE_HOST} ^host1.* [OR]

RewriteCond %{REMOTE_HOST} ^host2.* [OR]

RewriteCond %{REMOTE_HOST} ^host3.*

RewriteRule (.*)$ test.php



上面语句的作用是如果你的地址是host1或host2或host3的时候,则就跳到对test.php。从这里可以看出,RewriteCond语句之间默认的是AND,如果想要OR,则要明确的写出来。

下面是自己收藏的一些有用的重写规则:

RewriteCond %{REQUEST_FILENAME} !-f   //如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写)

RewriteCond %{REQUEST_FILENAME} !-d   //#如果目录存在就直接访问目录不进行RewriteRule

RewriteCond %{REQUEST_URI} !^.*(/.css|/.js|/.gif|/.png|/.jpg|/.jpeg)$ //#如果是这些后缀的文件,就直接访问文件,不进行Rewrite


Rewrite重写任务基本上都是由RewriteCond和RewriteRule两个命令配合完成。



首先看一段简单代码:


RewriteBase /


RewriteCond %{http_host} ^google.com$ [NC]


RewriteRule ^(.*)$ http://www.google.com/$1 [R=301]


下面对上述代码做一下分析:


(1).RewriteBase /规定根目录为基准路径,具体参阅.htaccess RewriteBase用法一章节。


(2).RewriteCond规定重写的条件,如果条件成立,那么将会执行RewriteRule所规定的重写规则。


具体代码细节,后面会做介绍,它实现不带www的URL跳转到带有www的URL,比如:


google.com/article-451-1.html


# 跳转到如下链接


www.google.com/article-451-1.html



一.RewriteCond命令:


它用来定义重写规则执行的条件。


语法结构:


RewriteCond String Pattern [flags]


定义一个条件,当String所规定的内容与Pattern规则匹配时,才会执行RewriteRule规定重写。


参数解析:


1.String:纯文本的字符串,除了包含普通的字符外,还可以包括下列的可扩展结构:


(1).$N:RewriteRule后向引用。$N引用紧跟在RewriteCond之后的RewriteRule中Pattern的小括号中的规则在当前URL中匹配的内容。N是0 <= N <= 9之间的整数。

(2).%N:RewriteCond后向引用 。%N引用最后一个RewriteCond的Pattern中的小括号中的规则在当前URL中匹配的内容。N是0 <= N <= 9之间的整数。

2.Pattern:应用于当前实例TestString的正则表达式 ,还可以包括以下扩展:


(1).!:表示TestString不与当前正则匹配;格式是!CondPattern。


(2).>: 将condPattern作为普通字符串与String比较,String大于Pattern为真;格式是>Pattern。


(3).=:将condPattern作为普通字符串与String比较,String与Pattern相同时为真;格式是=Pattern。


(4).-d:将String当作一个目录名,检查它是否存在以及是否是一个目录;格式是-d。


(5).-f:将String当作一个文件名,检查它是否存在以及是否是一个文件;格式是-f。


(6).-s:将String当作一个文件名,检查它是否存在以及是否是一个长度大于0的文件;格式是-s。


(7).-l: 将String当作一个文件名,检查它是否存在以及是否是一个 symbolic link;格式是-l。


(8).-F:检查String是否是一个合法的文件,而且通过服务器范围内的当前设置的访问控制进行访问。检查通过一个内部subrequest完成的, 因此需要谨慎使用,以防止降低服务器的性能。


(9).-U:检查String是否是一个合法的URL,而且通过服务器范围内的当前设置的访问控制进行访问。检查通过一个内部subrequest完成的, 因此需要谨慎使用,以防止降低服务器的性能。


3.[flags]:多个标志之间用逗号分隔。


(1).NC:表示不区分大小写。


(2).OR:默认的情况下,二个条件之间是AND的关系,用这个标志将关系改为OR。


二.RewriteRule命令:


它用来规定当RewriteCond条件满足时要执行的规则。


语法结构:


RewriteRule Pattern Substitution [flags]


参数解析:


1.Pattern:作用于当前URL的正则表达式;此url不包含协议、域名和查询字符串部分。


2.Substitution:当RewriteCond满足时,用来替换原始URL指定内容的字符串,还可以包括以下扩展:


(1).$N:RewriteRule后向引用。$N引用紧跟在RewriteCond之后的RewriteRule中Pattern的小括号中的规则在当前URL中匹配的内容。N是0 <= N <= 9之间的整数。

(2).%N:RewriteCond后向引用 。%N引用最后一个RewriteCond的Pattern中的小括号中的规则在当前URL中匹配的内容。N是0 <= N <= 9之间的整数。

3.[flags]:多个标志之间用逗号分隔,下面是常见的一些flag:


(1).R:表示重定性,[R=301]表示301重定向,默认是302重定向。


(2).F:强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。


(3).G:强制当前URL为已废弃的,即,立即反馈一个HTTP响应代码410(已废弃的)。


(4).L:立即停止重写操作,并不再应用其他重写规则。 


(5).N:重新执行重写操作(从第一个规则重新开始). 这时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理的URL。


(6).C:此标记使当前规则与下一个(其本身又可以与其后继规则相链接的, 并可以如此反复的)规则相链接。 它产生这样一个效果: 如果一个规则被匹配,通常会继续处理其后继规则, 即,这个标记不起作用;如果规则不能被匹配,则其后继的链接的规则会被忽略。


(7).NC:忽略大小写。


(8).QSA:此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。


代码实例:


RewriteCond %{http_host} ^google.com$ [NC]


RewriteRule ^(.*)$ www.google.com/$1 [R=301]


代码解析如下:


(1).RewriteCond用来规定执行后面重写的条件。


(2).%{http_host}是一个服务器变量,可以获取访问的域名,如果域名是”google.com”,添加成立。


(3).RewriteRule规定当RewriteCond条件成立索要执行的重写规则。


(4).^(.*)$获取URL除去协议、域名和查询字符串部分,比如google.com/forum.php?mod=viewthread&tid=1,只获取forum.php部分,域名和查询部分不会被获取,如果要获取可以参阅RewriteRule QSA用法一章节。


(5).$1表示^(.*)$小括号所匹配的内容,$2表示第二个小括号所匹配的内容,以此类推。


(6).[R=301]表示原始网址重定向为后来重写的网址。


(7).用google.com/forum.php?mod=viewthread&tid=1访问,google.com/forum.php被www.google.com/forum.php替换,最终是以www.google.com/forum.php?mod=viewthread&tid=1访问页面。


RewriteCond %{HTTP_HOST} ^(.+).google.com$   


RewriteRule ^/([w]+)/([d]+)$ /service/detail.html?id=$1&date=$2&c=%1 [L]


代码分析如下:


(1).%{HTTP_HOST}获取域名。


(2).^(.+).google.com$表示任何以google.com为根域名的域名。


(3).^/([w]+)/([d]+)$获取访问url两个斜线之间的部分,比如a/b/x.php,那么将会获取a/b。


(4).$1获取^/([w]+)/([d]+)$第一个小括号匹配的内容。


(5).$2获取^/([w]+)/([d]+)$第二个小括号匹配的内容。


(6).%1获取^(.+).google.com$第一个小括号匹配的内容。


(7)$代表结束。


RewriteRule forum.php?mod=viewthread&tid=100 article-2094-1.html [R=301]


本意是,链接(www.)google.comforum.php?mod=viewthread&tid=100跳转到(www.)google.article-2094-1.html,但是结果却非常让人失望,


最后结果如下:


(www.)google.article-2094-1.html??mod=viewthread&tid=100


如果Substitution没有查询字符串部分,那么它附加原来URL查询字符串部分。


代码修改如下:


RewriteRule forum.php?mod=viewthread&tid=100 article-2094-1.html? [R=301]


再后面添加一个问号即可。



温馨提示:

欢迎阅读本文章,觉得有用就多来支持一下,没有能帮到您,还有很多文章,希望有一天能帮到您。

RewriteCond与RewriteRule用法---相关文章


评论区

ddddd

程序员-学习的网站-想学习编程的码农可以进来看看

首页

视频教程

购物车

我的订单