Apache URL重写规则

mod_rewrite模块在运行时会使用两个Hook程序。

第一个是从URL到文件名转换的Hook。当有访问到达Apache服务器的时,服务器会确认相应主机(或虚拟主机),这时mod_rewrite模块就开始工作,它将会先处理服务器全局中mod_rewrite模块所提供的指令,然后根据用户提供的指令进行改写。

第二个是修正URL的Hook。在此阶段mod_rewrite模块会处理非全局的设置。例如,目录中的.htaccess文件中的设置。但是此时已经完成URL的翻译(由URL转换为文件名),因此是无法在次对目录级别的URL进行改写操作,但是moe_rewrite模块会将已翻译的URL再次转换为URL的状态,继续进行目录级别的URL改写。(mod_rewrite模块将会使用读后请求阶段的回叫函数重新开始一个请求的循环处理)

Rewirte模块规则集的处理

当mod_rewrite在这两个API阶段中开始执行时,它会读取配置结构中配置好的 (或者是在服务启动时建立的服务器级的,或者是在遍历目录采集到的目录级的)规则集,然后,启动URL重写引擎来处理(带有一个或多个条件的)规则集。无论是服务器级的还是目录级的规则集,都是由同一个URL重写引擎处理,只是最终结果处理不同而已。

规则集中规则的顺序是很重要的,因为重写引擎是按一种特殊的顺序处理的:逐个遍历每个规则(RewriteRule指令),如果出现一个匹配条件的规则,则可能回头遍历已有的规则条件(RewriteCond指令)。由于历史的原因,条件规则是前置的,所以控制流程略显冗长,细节见图

789055-20170415203330595-751643582.jpg

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

789055-20170415204144048-523904519.png

最简单的重写指令可以简单到让你无法想象!

只需要两步就可以完成了。第一使用RewriteEngine开启mod_rewrite模块功能;第二通过RewriteRule定义URL重写规则

---------------------------------------------------------------
RewriteEngine on   #开启mod_rewrite模块功能
RewriteBase 路径     #基准URL(使用alias设置别名则需使用这个)
RewriteCond TestString CondPattern [flags]      #重写条件(可以多个)
RewriteRule Pattern Substitution [flags]          #重写规则
----------------------------------------------------------------
#4、5行可以可以多个
#按顺序一个一个执行RewriteRule([flags不终止情况下])
##以上是常用的指令,还有一些很少见的指令,需要的自己去查资料了解


关键词:
返回列表

相关文章

相关案例