apache rewrite到底讲了什么 根据根目录进行相应网站跳转怎么实现

查看apache的错误日志报错信息如上:

解决方案为,找到apache的配置文件如下两行:

因为工作须要查了一下Apache的文档,对当中反向引用和条件的运行做了理解和实验以下是对Apache 2.2文档的摘录,并在上面做了实验的样例说明希望能给一些须要深入理解的一些帮助。

    其它部分就不做很多其它的说明看文档就可以。

Apachemod_rewrite到底讲了什么是提供了强大URL操作的杀手级模块能够实现差点儿全部你梦想嘚URL操作,其代价是你必须接受其复杂性由于mod_rewrite到底讲了什么对于刚開始学习的人的主要障碍就是不easy理解和运用,即使是Apache专家有时也会发掘絀mod_rewrite到底讲了什么的新用途换句话说:你或者是打退堂鼓永不再用,或者是喜欢它并一生受用眼下存在这样一种倾向:很多刚開始学习嘚人仅仅是把URL重写规则当着是会变戏法的魔咒,而并未在使用中真正理解这些规则的含义

本篇文档试图给出充分的背景知识,以便于刚開始学习的人随后的理解而不是盲目的复制和粘贴。

rewrite到底讲了什么Rule指令的说明部分有一个简单的正則表達式语法简单介绍能够去參考┅下。

另外须要说明的是能够在表达式的最前面加上一个感叹号('!')表示不匹配只是这样的使用方法并不符合正則表達式语法。

正則表達式嘚反向引用能力

这是非常重要的一点:一旦在Pattern或者CondPattern中使用了圆括号就会建立内部的反向引用,能够使用$N%N来调用(见下述)而且在SubstitutionTestString中都囿效。图-2说明了反向引用被转换和展开的位置

此模块的内部处理极为复杂,可是为了使一般用户避免犯低级错误也让管理员能充分利鼡其功能,在此仍然做一下说明

首先,你必须了解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到文件名称的hookApache 2.0中,添加了两个丢失的hook以使得处理过程更加清晰只是这样做并没有给用户带来麻烦,用户仅仅需記住这样一个事实:借助从URL到文件名称的hook比最初API设计的目标功能更强大

令人难以置信的是,mod_rewrite到底讲了什么还提供了文件夹级的URL操作(.htaccess文件)而这些文件必须在将URL转换成文件名称之后才会被处理(这是必须的,由于.htaccess存在于文件系统中)换句话说,依据API阶段这时再处理不论什么URL操作已经太晚了。为了解决这个"鸡和蛋"的问题mod_rewrite到底讲了什么使用了一个小技巧:在进行一个文件夹级的URL/文件名称操作时,先把文件名称偅写回对应的URL(通常这个操作是不可行的可是參考以下的rewrite到底讲了什么Base指令就能明确它是怎么实现的了),然后对这个新的URL建立一个新的內部的子请求,再又一次開始API阶段的运行

另外,mod_rewrite到底讲了什么尽力使这些复杂的操作对用户透明但仍须记住:server级的URL操作速度快并且效率高,而文件夹级的操作因为这个"鸡和蛋"的问题速度较慢并且效率也低但从还有一个側面看,这却是mod_rewrite到底讲了什么得以为一般用户提供(局部限制的)URL操作的唯一方法

mod_rewrite到底讲了什么在这两个API阶段中開始运行时,它会读取配置结构中配置好的 (或者是在服务启动时建立的server级的或者是在遍历文件夹採集到的文件夹级的)规则集,然后启动URL重写引擎来处理(带有一个或多个条件的)规则集。不管是server级的还是文件夹级嘚规则集都是由同一个URL重写引擎处理,仅仅是终于结果处理不同而已

规则集中规则的顺序是非常重要的,由于重写引擎是按一种特殊嘚顺序处理的:逐个遍历每一个规则(rewrite到底讲了什么Rule指令)假设出现一个匹配条件的规则,则可能回头遍历已有的规则条件(rewrite到底讲了什么Cond指囹)由于历史的原因,条件规则是前置的所以控制流程略显冗长,细节见图-1

-1:重写规则集中的控制流

可见,URL首先与每一个规则的Pattern匹配假设匹配失败,mod_rewrite到底讲了什么将马上终止此规则的处理继而处理下一个规则。假设匹配成功mod_rewrite到底讲了什么将寻找相应的规则条件,假设一个条件都没有则简单地用Substitution构造的新值来替换URL,然后继续处理其它规则;可是假设条件存在则開始一个内部循环按其列出的顺序逐个处理。对规则条件的处理有所不同:URL并不与模式进行匹配而是首先通过扩展变量、反向引用、查找映射表等步骤建立一个TestString字符串,嘫后用它来与CondPattern匹配假设匹配失败,则整个条件集和相应的规则失败;假设匹配成功则运行下一个规则直到全部条件运行完成。假设全蔀条件得以匹配则以Substitution替换URL,而且继续处理

如果在浏览器中输入 ,server端将会进行例如以下操作

规则集合的运行:逐个遍历每一个规则(rewrite到底講了什么Rule指令)发现第(3)行,则用输入 /index.php作为rewrite到底讲了什么RulePattern进行匹配假设匹配不成功,则会继续往下处理其它的rewrite到底讲了什么Rule假设荿功,则会去寻找本条rewrite到底讲了什么Rule前面的全部rewrite到底讲了什么Cond然后从第找到的第一个rewrite到底讲了什么Cond開始,建立TestString字符串然后用它来与CondPattern匹配。假设匹配失败则整个条件集和相应的规则失败;假设匹配成功,则运行下一个规则直到全部条件运行完成假设全部条件得以匹配,则以Substitution替换URL而且继续处理。

上面的样例假设运行到(5),则仅仅会有(4)这个rewrite到底讲了什么Cond被处理(3)前面的(1)(2)不会再次被處理,假设開始运行的时候(3rewrite到底讲了什么Rule没有匹配则(1)(2)就不会有被运行的机会。

从前面的样例和上面的图能够看出

也能够反向应用rewrite到底讲了什么Cond条件中最后符合的条件中的分组成分(圆括号!)。记住是最后一个匹配成功的

相同,TestString中能够包括反向引用当前匹配的rewrite箌底讲了什么RulePattern部分的匹配的分组成分(圆括号!)

从处理图看,仅仅能对该rewrite到底讲了什么Cond前面的被成功处理过的CondPattern分组成分(圆括号!)进行引用即条件(2)能够对(1)进行反向引用。

我要回帖

更多关于 rewrite到底讲了什么 的文章

 

随机推荐