使用到PHP的一些框架的时候,通常由index.php
做统一路由,难免使用到Rewirte
。做一些知识点的记录,忘记时,方便查阅。
Rewirte
主要的功能就是实现URL的跳转,隐藏URL真实地址,可以帮助我们实现拟静态,拟目录,域名跳转,防止盗链,搜索引擎的收录等。
一、启用mod_rewrite模块
在Apache配置文件httpd.conf
确保启用mod_rewrite模块
# LoadModule rewrite_module modules/mod_rewrite.so (去除前面的 #)
二、开启rewrite功能
1)使用.htaccess
文件的方式
即在一个特定的目录中放置一个包含配置指令的.htaccess
文件,其中的指令作用于此目录及其所有子目录。
在http.conf
文件,项目中配置AllowOverride All
(允许重写apache默认配置),项目下的目录中的.htaccess
文件规则才能起作用。
如:使用本地的8082端口,设定一个项目。
Listen 8082NameVirtualHost *:8082<VirtualHost *:8082>DocumentRoot "D:\wwwroot\test"ServerName *:8082<Directory "D:\wwwroot\test">Options Indexes FollowSymLinks Order allow,denyAllow from allAllowOverride all #允许重写apache默认配置</Directory></VirtualHost>
然后在D:\wwwroot\test
下的.htaccess
文件书写rewrite的规则。如:
<IfModule mod_rewrite.c>RewriteEngine On #开启 url rewrite# ...rewrite规则# ...rewrite规则# ...rewrite规则</IfModule>
PS:
AllowOverride 它只能在<Directory>
中生效
弊端:
启用了.htaccess文件,则Apache需要在每个目录中查找.htaccess文件,因此,无论是否真正用到,启用.htaccess都会导致性能的下降。另外,对每一个请求,都需要读取一次.htaccess文件。还有,Apache必须在所有上级的目录中查找.htaccess文件,以使所有有效的指令都起作用。
其次,每一个项目都能进行apache的配置修改,安全性大大降低等。
在http.conf
文件,根目录的AllowOverride属性一般都配置成不允许任何Override
<Directory />AllowOverride none</Directory>
2)配置服务器的httpd.conf
的方式
使用本地的8085端口,设定一个项目。
Listen 8085NameVirtualHost *:8085<VirtualHost *:8085>DocumentRoot "D:\wwwroot\test"ServerName *:8085<Directory "D:\wwwroot\test">Options Indexes FollowSymLinks Order allow,denyAllow from allRewriteEngine On #开启 url rewrite# ...rewrite规则# ...rewrite规则# ...rewrite规则</Directory></VirtualHost>
如有服务器的权限一般使用第二种方式
另外的知识点:
Options指令的主要作用是控制特定目录将启用哪些服务器特性。
详情:/page/apache-options-directive.htm
在Apache配置文件中,给指定目录设置基本的访问权限,主要是靠Allow、Deny、Order三个指令的配合使用来实现的。
详情:/page/apache-directory-access-control.htm
三、rewrite规则
对于Rewrite来说共有九个指令:RewriteEngine,RewriteBase, RewriteCond, RewriteLock, RewriteLog, RewriteLogLevel, RewriteMap, RewriteOptions, RewriteRule。通常最常用的是 RewriteEngine, RewriteCond, RewriteRule 三个指令。
RewriteEngine
这个是rewrite功能的总开关,用来开启是否启动url rewrite,使用就设置成 on, 否则设置成 off
RewriteCond 语法:RewriteCond TestString CondPattern [flags]
RewriteRule 语法:RewriteRule Pattern Substitution [flags]
首先得了解这个流程,如下官网的图
(图1)
(图2)
RewriteCond 和 RewriteRule 是上下对应的关系。可以有1个或者好几个RewriteCond来匹配一个RewriteRule
首先URL会与每条RewriteRule
规则的模板pattern
比较,当匹配失败时,立即停止对当前规则的处理进入下一条RewriteRule
规则;当匹配成功时,寻找相关的RewriteCond
条件;如果没有相关的RewriteCond
条件,则直接执行RewriteRule
规则中定义的替换,然后回到规则遍历的过程。如果有相关的RewriteCond
条件,则启动一个内部循环,依次检查各个RewriteCond
条件。
只要其中有RewriteCond
条件匹配失败,则整个RewriteCond
条件集且这个RewriteRule
规则都不再执行,然后回到规则遍历中;如果所有的RewriteCond
条件都满足,则执行RewriteRule
规则中定义的替换动作。
RewriteCond和RewriteRule的规则写法(待整理)
参考:
/u013927110/article/details/41414091
/phper/note/73726
/qq_36031499/article/details/54317366
/archives/99
/lpy123456/article/details/1404714
官网
/docs/current/mod/mod_rewrite.html
/docs/2.0/mod/mod_rewrite.html