做个PHP框架(2)路由Router(二)rewrite模块的使用【20201025】

发表于 2020-10-26 09:39:38
阅读 102

介绍

介绍

今天我们主要需要达到的目标就是解决路由模块的核心功能,实现资源路径的映射功能。要实现资源路径的映射就需要能够对资源路径映射的操作有控制权,需要获得资源路径映射的控制权就需要借助Apache的rewrite模块了。

Apache的rewrite模块是一个很厉害的模块,它实现在用户发起的请求达到服务器之后由服务器进行URI解析之前的资源映射的自定义处理机制。这使得我们可以建立一套非对称的资源映射规则,将用户请求的不同资源映射给同一个路由控制器来处理,这样我们就可以在处理用户请求这个环节大做文章了。

因为PHP和Apache是绝配,所以福哥假定大家的运行环境都是Apache了。如果哪位童鞋用的不是Apache的话,可以私下和福哥反馈,我们一起想解决方案。

rewrite

Apache是运行php语言的主流web服务器软件,Apache有很多模块,这些模块赋予了Apache非常多的特殊能力,其中一个非常实用的模块就是地址重写(rewrite)模块,这个模块可以将Apache对资源路径的映射的控制权交与我们自己来处理,这样我们就可以实现TFPHP的路由功能了。

打开配置文件,搜索“rewrite”模块,将模块前面的“#”去掉打开rewrite模块支持:

[root@dev httpd-2.4.46]# vi conf/httpd.conf

88d2209711ccf767.jpg打开配置文件,搜索“Directory”,找到“/tongfu.net/web”的配置位置,将AllowOverride改为All:

[root@dev httpd-2.4.46]# vi conf/httpd.conf

76b57fa664770a46.jpg

重启Apache服务,这里会提示找不到tfphp目录,我们马上建立它

[root@tfdev httpd-2.4.46]# ./bin/apachectl restart
AH00112: Warning: DocumentRoot [/tongfu.net/web/tfphp] does not exist

框架目录

我们框架的名称是TFPHP,所以建立目录 /tongfu.net/web/tfphp 作为我们框架的根目录。路由模块福哥认为属于系统级别的功能模块,所以福哥打算给放到System子目录下面。在路由模块建立对象名称TFRouter,保存php程序文件名称TFRouter.inc.php。

844c68256f414ee6.jpg

路由模块

现在我们就开始实现TFPHP的路由模块功能了,首先我们需要搭建一个调试环境,用来调试我们的路由功能。

配置rewrite规则

我们在tfphp目录下面建立一个“.htaccess”文件用来动态配置Apache服务器

5bbbb322bf4a6917.jpg在“.htaccess”里写下如下配置信息:

# the router of tfphp
RewriteEngine On

RewriteCond %{REQUEST_URI}                           !(\.(js|css|jpg|jpeg|pjpeg|png|gif|txt|ico))$ [NC] ### resource extension
RewriteCond %{REQUEST_URI}                           !(TFRouteMap\.php|server\-status|server\-info) [NC] ### route script and server special
RewriteRule ^(.*)$                                   /TFRouteMap.php?$1 [L]

路由入口程序

我们在tfphp根目录建立一个“TFRouteMap.php”文件用来处理资源路径的路由功能

e0107dfcbeccf92a.jpg在“TFRouteMap.php”里写下如下代码:

<?php

var_dump($_SERVER['QUERY_STRING']);

测试

现在我们来测试一下路由模块的基本功能效果,随便访问一个网址,就可以在页面上打印出来网址的资源路径部分的内容。

1e49a7fc0e8e32ae.jpg就是说我们访问任何一个网址,如果网址资源路径不包含RewriteCond里面提到的内容的话,这个网址的资源路径就会被传递给TFRouteMap.php进行处理,也就是说这些网址都会映射到TFRouteMap.php这个集中处理的php程序上。

总结

今天我们给Apache配置了rewrite功能,利用rewrite功能我们将访问8068端口的所有请求都映射到了TFRouteMap.php这个路由入口程序上。也就是说路由模块的第一步我们已经完成了,接下来我们就要开始设计TFPHP的路由逻辑了,我们需要定义TFPHP的路由对象,通过它实现将资源路径映射到控制器对象的目的。

下一课福哥将带着大家设计TFRouter对象,完成路由功能的最后一个环节,资源路径与控制器对象的映射功能。

P.S.

微信公众号的文章发出去之后是不能编辑的,但是福哥偶尔会修复一些描述不到位、示例不正确、结构不清晰等等的文章错误,这些只能在网站上才能看到最新版本内容,望大家知晓~~