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.phpRewriteCond %{HTTP_USER_AGENT} ^Lynx.*
RewriteRule index.php index.L.phpRewriteRule 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解释的主要内容,如果未能解决你的问题,请参考以下文章
R语言基于自定义函数构建xgboost模型并使用LIME解释器进行模型预测结果解释:基于训练数据以及模型构建LIME解释器解释多个iris数据样本的预测结果使用LIME解释器进行模型预测结果解释
R语言基于自定义函数构建xgboost模型并使用LIME解释器进行模型预测结果解释:基于训练数据以及模型构建LIME解释器解释一个iris数据样本的预测结果LIME解释器进行模型预测结果解释并可视化