码迷,mamicode.com
首页 > 其他好文 > 详细

RewriteCond/RewriteRule解释

时间:2018-09-12 19:58:15      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:.com   信息   正则表达式   redirect   idt   页面   .htaccess   服务器   tps   

技术分享图片

在编写Apache重写或者看别人的重写时,经常会看到以下段落

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5.0.*
RewriteRule index.php index.m.php

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。

例二:

RewriteCond %{HTTP_USER_AGENT} (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 TString Pattern [flags]

TString为被匹配的字符串,可以是

RewriteRule反向引用($N)、
RewriteCond反向引用(%N)、
服务器变量(%{NAME_OF_VARIABLE})
RewriteMap扩展(${mapname:key|default})

Pattern是一个应用于当前实例TString的正则表达式。

TString将会计算后与Pattern匹配

返回两个结果, 要么为match要么为no-match, 为match继续往下执行

具体参数参见apache中RewriteCond中文手册

 

RewriteRule

此指令可以多次使用。每个指令定义一个简单的重写规则。这些规则的定义顺序尤为重要
在运行时,规则是按这个顺序生效的

具体参数参见
Apache ReWriteRule参数
apache中RewriteCond中文手册
给一张[flag]速查表

RewriteRule标记 含义 描述
R Redirect 发出一个HTTP重定向
F Forbidden 禁止对URL地址的存取
G Gone 标记URL地址不存在
P Proxy 将URL地址传递至mod_proxy
L Last 停止处理接下来的规则
N Next 再次从第一个规则开始处理,但是使用当前重写后的URL地址
C Chain 将当前的规则和紧随其后的规则链接起来
T Type 强制执行指明的MIME类
NS Nosubreq 只在没有任何内部子请求执行时运用本规则
NC Nocase URL地址匹配对大小写敏感
QSA Qsappend 在新的URL地址后附加查询字符串部分,而不替代
PT Passthrough 将重写后的URL地址传递给另一个Apache模块进行进一步处理
S Skip 忽略之后的规则
E Env 设置环境变量

 

例子

<IfModule mod_rewrite.c> 
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?url=$1 [PT,L]
</IfModule>

上面规则,意思是当前请求不是文件,也不是目录,这将url重写到index.php入口文件。

 

调试Apache的rewrite规则方法(rewrite日志)

你调试apache的重写规则调试到抓狂过吗?
你有看到项目htaccess中N条重写规则而不知所措吗?
我想肯定有,下面介绍让如何让你明明白白的调试apache的重写规则。

1. apache版本在2.4以下

mod_rewrite是带有日志功能的,开启的方法如下:
在apache的配置文件中增加

RewriteLog "/myfolder/mylogfile.log"
RewriteLogLevel 9

Rewriteloglevel 0 代表关闭,9代表开启最大debug输出,调为9可以看到最详细的重写匹配信息.请将上面”/myfolder/mylogfile.log”替换为你电脑上的实际路径,添加好之后重启apache,访问重写页面的时候apache就会自动的日志文件里面增加记录了

2. apache版本2.4及以上

那些熟悉早期版本的mod_rewrite的无疑将寻找RewriteLog和RewriteLogLevel指令。此功能已被下述的新的模块的日志记录配置完全取代。

LogLevel alert rewrite:trace3

其中,记录等于由trace1~trace8,数值越大,记录的信息越多。你将能够在你的 apache配置的error_log 中看到这些信息。

注意:

  • Apache的RewriteLog指令只能在conf文件中,不能在.htaccess文件。
  • 使用高跟踪日志级别的mod_rewrite将显着减慢你的Apache HTTP服务器!使用日志级别高于trace2只用于调试!
  • 生产环境请连配置项目都移除,以免影响性能。

RewriteCond/RewriteRule解释

标签:.com   信息   正则表达式   redirect   idt   页面   .htaccess   服务器   tps   

原文地址:https://www.cnblogs.com/phptec/p/9636166.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!