Apache Rewrite 理解
因为工作须要,查了一下Apache的文档,对当中反向引用和条件的运行做了理解和实验,以下是对Apache 2.2文档的摘录,并在上面做了实验的样例说明,希望能给一些须要深入理解的一些帮助。
其它部分就不做很多其它的说明,看文档就可以。
Apache的mod_rewrite是提供了强大URL操作的杀手级模块,能够实现差点儿全部你梦想的URL操作,其代价是你必须接受其复杂性,由于mod_rewrite对于刚開始学习的人的主要障碍就是不easy理解和运用,即使是Apache专家有时也会发掘出mod_rewrite的新用途。换句话说:你或者是打退堂鼓永不再用,或者是喜欢它并一生受用。眼下存在这样一种倾向:很多刚開始学习的人仅仅是把URL重写规则当着是会变戏法的魔咒,而并未在使用中真正理解这些规则的含义。
本篇文档试图给出充分的背景知识,以便于刚開始学习的人随后的理解,而不是盲目的复制和粘贴。
mod_rewrite使用的是Perl兼容的正則表達式语法。本文不打算具体解说正則表達式语法,你能够到PCRE man page, Perl regular expression man page, Mastering Regular Expressions, by Jeffrey Friedl获得这些内容。
RewriteRule指令的说明部分有一个简单的正則表達式语法简单介绍,能够去參考一下。
另外须要说明的是能够在表达式的最前面加上一个感叹号('!')表示不匹配,只是这样的使用方法并不符合正則表達式语法。
正則表達式的反向引用能力
这是非常重要的一点:一旦在Pattern或者CondPattern中使用了圆括号,就会建立内部的反向引用,能够使用$N和%N来调用(见下述),而且在Substitution和TestString中都有效。图-2说明了反向引用被转换和展开的位置。
图-2: The back-reference flow through a rule.
内部处理
此模块的内部处理极为复杂,可是为了使一般用户避免犯低级错误,也让管理员能充分利用其功能,在此仍然做一下说明。
API阶段
首先,你必须了解Apache是分若干阶段来处理HTTP请求的。Apache API对每一个阶段都提供了一个hook程序。mod_rewrite使用两个hook程序:其一,从URL到文件名称的转换hook(用在读取HTTP请求之后、授权開始之前); 其二,修正hook(用在授权阶段和读取文件夹级配置(.htaccess)之后、内容处理器激活之前)。
所以,Apache收到一个请求而且确定了响应主机(或虚拟主机)之后,重写引擎即開始处理server级配置中的全部mod_rewrite指令(此时处于从URL到文件名称转换的阶段),此阶段完毕后,终于的数据文件夹便确定了。接下来进入修正程序段并触发文件夹级配置中的mod_rewrite指令。这两个阶段并非泾渭分明的,但都实施了把URL重写成新的URL或者文件名称。尽管API最初不是为此目的而设计的,可是如今它已经成为了API的一种用途。记住下面两点,会有助于更好地理解:
尽管mod_rewrite能够将URL重写为新的URL或文件名称,甚至将文件名称重写为新的文件名称,可是之前的API仅仅提供从URL到文件名称的hook。在Apache 2.0中,添加了两个丢失的hook以使得处理过程更加清晰。只是这样做并没有给用户带来麻烦,用户仅仅需记住这样一个事实:借助从URL到文件名称的hook比最初API设计的目标功能更强大。
令人难以置信的是,mod_rewrite还提供了文件夹级的URL操作(.htaccess文件),而这些文件必须在将URL转换成文件名称之后才会被处理(这是必须的,由于.htaccess存在于文件系统中)。换句话说,依据API阶段,这时再处理不论什么URL操作已经太晚了。为了解决这个"鸡和蛋"的问题,mod_rewrite使用了一个小技巧:在进行一个文件夹级的URL/文件名称操作时,先把文件名称重写回对应的URL(通常这个操作是不可行的,可是參考以下的RewriteBase指令就能明确它是怎么实现的了),然后,对这个新的URL建立一个新的内部的子请求,再又一次開始API阶段的运行。
另外,mod_rewrite尽力使这些复杂的操作对用户透明。但仍须记住:server级的URL操作速度快并且效率高,而文件夹级的操作因为这个"鸡和蛋"的问题速度较慢并且效率也低。但从还有一个側面看,这却是mod_rewrite得以为一般用户提供(局部限制的)URL操作的唯一方法。
牢记这两点!
规则集的处理
当mod_rewrite在这两个API阶段中開始运行时,它会读取配置结构中配置好的 (或者是在服务启动时建立的server级的,或者是在遍历文件夹採集到的文件夹级的)规则集,然后,启动URL重写引擎来处理(带有一个或多个条件的)规则集。不管是server级的还是文件夹级的规则集,都是由同一个URL重写引擎处理,仅仅是终于结果处理不同而已。
规则集中规则的顺序是非常重要的,由于重写引擎是按一种特殊的顺序处理的:逐个遍历每一个规则(RewriteRule指令),假设出现一个匹配条件的规则,则可能回头遍历已有的规则条件(RewriteCond指令)。由于历史的原因,条件规则是前置的,所以控制流程略显冗长,细节见图-1。
图-1:重写规则集中的控制流
可见,URL首先与每一个规则的Pattern匹配,假设匹配失败,mod_rewrite将马上终止此规则的处理,继而处理下一个规则。假设匹配成功,mod_rewrite将寻找相应的规则条件,假设一个条件都没有,则简单地用Substitution构造的新值来替换URL,然后继续处理其它规则;可是假设条件存在,则開始一个内部循环按其列出的顺序逐个处理。对规则条件的处理有所不同:URL并不与模式进行匹配,而是首先通过扩展变量、反向引用、查找映射表等步骤建立一个TestString字符串,然后用它来与CondPattern匹配。假设匹配失败,则整个条件集和相应的规则失败;假设匹配成功,则运行下一个规则直到全部条件运行完成。假设全部条件得以匹配,则以Substitution替换URL,而且继续处理。
比如以下的配置
RewriteEngine on
#设置Rewrite日志
RewriteLogLevel 9
RewriteLog "C:/Apache/logs/rewrite.log"
RewriteCond $1 ^(.*)/.(.*) [NC] (1)
RewriteCond %{HTTP_HOST} !^(.*)/.(.*)/.(.*) (2)
RewriteRule ^/(.*) /$1?ID=%1 (3)
#RewriteCond ............... (4)
#RewriteRule ^/(.*) ............ (5)
如果在浏览器中输入 http://www.domain.com/index.php,server端将会进行例如以下操作
规则集合的运行:逐个遍历每一个规则(RewriteRule指令),发现第(3)行,则用输入 /index.php作为RewriteRule的Pattern进行匹配,假设匹配不成功,则会继续往下处理其它的RewriteRule。假设成功,则会去寻找本条RewriteRule前面的全部RewriteCond,然后从第找到的第一个RewriteCond開始,建立TestString字符串,然后用它来与CondPattern匹配。假设匹配失败,则整个条件集和相应的规则失败;假设匹配成功,则运行下一个规则直到全部条件运行完成。假设全部条件得以匹配,则以Substitution替换URL,而且继续处理。
上面的样例,假设运行到(5),则仅仅会有(4)这个RewriteCond被处理,(3)前面的(1)(2)不会再次被处理,假设開始运行的时候(3)RewriteRule没有匹配,则(1)(2)就不会有被运行的机会。
反向引用:
从前面的样例和上面的图能够看出,
Substitution能够反向引用当前Pattern中的匹配的分组成分(圆括号!)。
引用方法是: $N (0 <= N <= 9)
也能够反向应用RewriteCond条件中最后符合的条件中的分组成分(圆括号!)。记住是最后一个匹配成功的。
引用方法是: %N (1 <= N <= 9)
相同,TestString中能够包括反向引用当前匹配的RewriteRule的Pattern部分的匹配的分组成分(圆括号!)。
引用方法是: $N (0 <= N <= 9)
从处理图看,仅仅能对该RewriteCond前面的被成功处理过的CondPattern分组成分(圆括号!)进行引用,即条件(2)能够对(1)进行反向引用。
转载于:https://www.cnblogs.com/zfyouxi/p/4298500.html
Apache Rewrite 理解相关推荐
- Apache Rewrite 规则详解
在开篇之前: 我想说这篇文章其实是我刚刚接触Rewrite的时候学习的文档,应属转载,但是在这里我不想写明原地址,原因是文章中大多数给出的配置命令经实验都是错误的.需要原文的可以在谷歌上搜索一下&qu ...
- (转)Apache Rewrite 详解
(转)Apache Rewrite 详解 参考文档:http://man.chinaunix.net/newsoft/ApacheManual/mod/mod_rewrite.html Apache ...
- .htaccess中的apache rewrite规则写法详解
.htaccess中的apache rewrite写法: 1 RewriteEngine On 2 RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ 3 Rewr ...
- Apache Rewrite url重定向功能的简单配置
1.Apache Rewrite的主要功能 就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 2.Apache Rewrite ...
- Apache rewrite
Apache rewrite mod_rewrite简介和配置 实URL跳转隐藏真实地址 拟目录 域名跳转 防止盗链 Apache配置支持httpd.conf配置.htaccess配置 启用rewri ...
- Apache Rewrite规则详解[转]
1.Rewrite规则简介:Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式.如果要想用 ...
- Apache Rewrite的主要功能
#Apache Rewrite的主要功能 #就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范. #平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 在httpd.conf中去掉 ...
- apache rewrite 二级域名
apache rewrite 二级域名 目的 当访问abc.test.com跳转到www.test.com/test/abc ,浏览器地址会显示abc.test.com地址. 方法 在apache的配 ...
- Apache Rewrite伪静态基本及URL跳转
Rewirte主要的功能就是实现URL的跳转,Rewirte代码的正则表达式是基于Perl语言.基于服务器级的(httpd.conf)和目 录级的 (.htaccess)两种方式,而我们Apache一 ...
- Apache Rewrite实现URL的跳转和域名跳转
为什么80%的码农都做不了架构师?>>> 1.Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基 于服务器级的(httpd.conf)和目录级 ...
最新文章
- SVG.path_不连续的线段
- find 命令_linux中find命令的使用
- 除了Postman之外,居然还有个Postwoman...
- IRIS在win2003中安装 报 error while loading a DLL错误
- 白话Elasticsearch56-数据建模之 Path Hierarchy Tokenizer 对文件系统进行数据建模以及文件搜索
- 成功导入并运行breeze jar库
- 前端 javascript 数据类型 字典
- spring AOP 之一:spring AOP功能介绍
- centos环境访问php显示源码,CentOS 6.8 搭建LNAMP环境(五)- PHP7源码安装Redis和Redis拓展...
- Git Submodule新漏洞已修复
- Python大数据处理扩展库pySpark用法精要
- 【汇编语言与计算机系统结构笔记01】x86/MIPS/ARM指令集概述与特性,一篇HPCA引发的思考(商业生态的决定性作用)
- JavaScript getBoundingClientRect()
- Atitti.软件的一些理论补充 Atitti.软件的原理原则定律法则补充 目录 1.1. 分布式领域CAP理论,	1 1.2. 关系数据库的ACID模型拥有 高一致性 + 可用性 很难进行分区:
- 【sketchup 2021】草图大师的场景优化工具2【草图大师动态组件的详细使用说明和各个函数说明】【重要】
- 三维旋转详细解读(Rodrigues‘ Roatation Formula 罗德里格旋转公式)
- url“forum.php,如何让discuz论坛首页打开不显示forum.php的方法分享
- 深度学习网络基础——感受野
- GNN从入门到精通 -- Graph Embedding (2)
- 3万字BI系统整体建设解决方案
热门文章
- WinSCP 提示:你的Shell可能与本程序不兼容(推荐使用Bash)。
- Win10 如何调整任务栏高度
- Python3中一维数组和二维数组的输入
- 2021回顾 | AI 领域十大研究趋势及必读论文
- 【CV学习笔记】图像的计算
- 【工大SCIR Lab】AAAI20 基于关键词注意力机制和回复弱监督的医疗对话槽填充研究...
- 【基础】网络常见的9大命令,非常实用!
- 每日算法系列【LeetCode 153】寻找旋转排序数组中的最小值
- seaborn—seaborn.distplot绘制直方图和连续密度统计
- 机器学习基础算法30-贝叶斯网络理论