RewriteCond/RewriteRule解释

Posted phptec

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RewriteCond/RewriteRule解释相关的知识,希望对你有一定的参考价值。

技术分享图片

在编写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解释的主要内容,如果未能解决你的问题,请参考以下文章

单个body|简单解释|复杂解释|反面解释

R语言基于自定义函数构建xgboost模型并使用LIME解释器进行模型预测结果解释:基于训练数据以及模型构建LIME解释器解释多个iris数据样本的预测结果使用LIME解释器进行模型预测结果解释

解释器模式和php实现

R语言基于自定义函数构建xgboost模型并使用LIME解释器进行模型预测结果解释:基于训练数据以及模型构建LIME解释器解释一个iris数据样本的预测结果LIME解释器进行模型预测结果解释并可视化

设计模式解释器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

解释器模式