Apache的Rewrite知识点梳理(mod_rewrite、RewriteCond、RewriteRule)

使用到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 8082
NameVirtualHost *:8082
<VirtualHost *:8082>
    DocumentRoot "D:\wwwroot\test"
    ServerName *:8082
	<Directory "D:\wwwroot\test">
        Options Indexes FollowSymLinks  
		Order allow,deny
		Allow from all
		AllowOverride 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 8085
NameVirtualHost *:8085
<VirtualHost *:8085>
    DocumentRoot "D:\wwwroot\test"
    ServerName *:8085
	<Directory "D:\wwwroot\test">
        Options Indexes FollowSymLinks  
		Order allow,deny
		Allow from all
		
	    RewriteEngine On #开启 url rewrite
	    # ...rewrite规则
		# ...rewrite规则
		# ...rewrite规则
	</Directory>
</VirtualHost>

如有服务器的权限一般使用第二种方式

另外的知识点:

Options指令的主要作用是控制特定目录将启用哪些服务器特性。
详情:http://www.365mini.com/page/apache-options-directive.htm
在Apache配置文件中,给指定目录设置基本的访问权限,主要是靠Allow、Deny、Order三个指令的配合使用来实现的。
详情:http://www.365mini.com/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]

说实话rewrite规则真有点让新手头疼,我就是如此。
首先得了解这个流程,如下官网的图
这里写图片描述(图1)
这里写图片描述(图2)

首先URL会与每条RewriteRule规则的模板pattern比较,当匹配失败时,立即停止对当前规则的处理进入下一条RewriteRule规则;当匹配成功时,寻找相关的RewriteCond条件;如果没有相关的RewriteCond条件,则直接执行RewriteRule规则中定义的替换,然后回到规则遍历的过程。如果有相关的RewriteCond条件,则启动一个内部循环,依次检查各个RewriteCond条件。
只要其中有RewriteCond条件匹配失败,则整个RewriteCond条件集且这个RewriteRule规则都不再执行,然后回到规则遍历中;如果所有的RewriteCond条件都满足,则执行RewriteRule规则中定义的替换动作。

RewriteCond和RewriteRule的规则写法(待整理)

参考:
https://blog.csdn.net/u013927110/article/details/41414091
https://zybuluo.com/phper/note/73726
https://blog.csdn.net/qq_36031499/article/details/54317366

http://dmyz.org/archives/99
https://blog.csdn.net/lpy123456/article/details/1404714

官网
http://httpd.apache.org/docs/current/mod/mod_rewrite.html
http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

猜你喜欢

转载自blog.csdn.net/weicy1510/article/details/81901695