ThinkPHP中URL解析原理,以及URL路由使用教程!
几个概念:
THINKPHP 是一个MVC框架,使用PATHINFO解析出分组名,模块名,方法名,以及参数。
PATHINFO:就是 http://localhost/index.php/Home/Index/index/a/1/b/2?c=3 中的红色部分,注意,c=3并不是pathinfo的一部分,它是一个query参数。PATHINFO指的是URL中的路径实际上不存在的时候,apache或nginx等通过一定的手段将这个不存在路径保存到环境变量 $_SERVER['PATH_INFO']中,也可以将它转化为$_GET['s']参数,TP也可以识别。
也就是说当你访问THINKPHP项目的时候,你实际上访问的只是入口文件index.php ,不管你后面有多长的路径,都是实际不存在的,转化成PATHINFO或$_GET['s']了而已。
那么THINKPHP就是根据PATHINFO,从中提取出 分组名,模块名,方法名,以及将剩余的部分转化为$_GET变量,比如TP从PATHINFO字符串中提取'Home'字符串,将其保存到$_GET['g'] ,$_GET['m']='Index' ;$_GET['a']='index' ;$_GET['a']=1 ;$_GET['b']=2。不信你可以随便在某个模块方法下 dump('$_GET')看看。
之后Tp就是根据$_GET['g'],$_GET['m'],$_GET['a']来加载实例化对应分组下的模块类,并执行对应的方法。
关于URL详细的解析流程,请看 ThinkPHP/Lib/Core/Dispatcher.class.php 核心类。
URL路由:
URL路由--Url Router,指的是,在TP进行常规url解析之前,先检测路由,如果发现有路由规则匹配当前的PATHINFO,那么URL解析则交给路由处理。
路由规则是由多条 rule=>router 规则组成的数组。
路由处理过程大概如下:
1.遍历路由规则rule,与当前PATHINFO字符串进行匹配,如果合法,则从PATHINFO中取出所需要的字符串。
2.路由中每条规则对应一个router,router中指定对应的模块以及方法,模块和方法可以用第1步中匹配到的字符串进行动态替代。
3.将剩余的参数都解析并写入到$_GET中。
路由规则:
list/2/p/1 ,我们需要访问id为1分类列表页,并且p是页码,第一页。
list/2/p/1
\d/p/:p
\d'=>'Home/list/index'
del/10 。要调用article模块下的del方法,并将10作为id传递给它
:1'
add/10中的add,规则只需要稍加改动,如下:
:1'
|拼接,比如 ^add|del|get
:1?p=1'
完整匹配整个PATHINFO,只需要在rule的结尾加上
$,比如
正则路由可以帮助你 。
ThinkPHP中URL解析原理,以及URL路由使用教程!的更多相关文章
- ThinkPHP中的pathinfo模式和URL重写
语文一直不太好,要我怎么解释这个pathinfo模式还真不知道怎么说,那就先来一段代码说下pathinfo模式吧 http://serverName/appName/module/action/id/ ...
- Thinkphp中路由Url获取的使用方法
Thinkphp是一个体系较为完整的框架,很多地方比国外的框架功能都全,唯一不喜之处是性能,和传说中的.NET有点像. Thinkphp提供较全url处理体系,通过同一规则实现Url的路由和Url生成 ...
- 在ASP.NET非MVC环境中(WebForm中)构造MVC的URL参数,以及如何根据URL解析出匹配到MVC路由的Controller和Action
目前项目中有个需求,需要在WebForm中去构造MVC的URL信息,这里写了一个帮助类可以在ASP.NET非MVC环境中(WebForm中)构造MVC的URL信息,主要就是借助当前Http上下文去构造 ...
- ThinkPHP中pathinfo模式与URL重写
Thinkphp中的pathinfo模式 http://serverName/appName/module/action/id/1/ pathinfo模式 在不考虑路由的情况下,第一个参数会被解析成模 ...
- thinkphp中URL传参数的几种方式
在thinkphp中,url传参合asp.net中原理类似,下面就单个参数和多个参数传递方式进行一个简单讲解 1.传单个参数 单个参数这种比较简单,例如 想像edit操作里面传递一个id值,如下写法_ ...
- java网络编程客户端与服务端原理以及用URL解析HTTP协议
常见客户端与服务端 客户端: 浏览器:IE 服务端: 服务器:web服务器(Tomcat),存储服务器,数据库服务器. (注:会用到Tomact服务器,在webapps下有一个自己创建的目录myweb ...
- 域名解析中的cname解析和显性URL跳转和隐性URL跳转三者有什么区别
通俗的来讲,cname解析还是属于dns解析,只是把某个域名解析到另外一个域名对应的某个IP的空间中,所以还需要在服务器端(比如nginx)做域名解析(比如把baidu.com做一个cname解析到i ...
- ThinkPHP中U方法与url的四种访问模式
ThinkPHP中U方法的用处主要是完成对url地址的组装,在模板中使用U方法而不是固定写死URL地址的好处在于,一旦你的环境变化或者参数设置改变,你不需要更改模板中的任何代码.在模板中的调用格式需 ...
- 「Python 编程」编码实现网络请求库中的 URL 解析器
摘要:怎么写出更短的代码并不是这次要讨论的话题.今天我们来研究一下:运行代码的计算机是如何找到目标服务器的? 相信各位 Python 开发者都用过 Requests 库,有些朋友还用过 WebSock ...
随机推荐
- 让JAVA代码跑得更快
本文简单介绍一下在写代码过程中用到的一些让JAVA代码更高效的技巧. 1. 将一些系统资源放在池中(如数据库连接, 线程等) 在standalone的应用中, 数据库连接池可以使用一些开源的连接池 ...
- Return Negative
Return Negative In this simple assignment you are given a number and have to make it negative. But m ...
- myhuiban会议,期刊,科研人员,计算机类会议大全
http://www.myhuiban.com/ List of computer science conferences From Wikipedia, the free encyclopedia ...
- poj 2488 A Knight's Journey( dfs )
题目:http://poj.org/problem?id=2488 题意: 给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. #include <io ...
- [原]Unity3D深入浅出 - 常用类的成员变量和成员函数(Tranform、Time、Random、Mathf、Input)
Transform的成员变量 Transform的成员函数 Time类,获取和时间相关的信息,可用来计算帧速率,调整时间流逝的速度等. Random类,可用来生成随机数,随机点和旋转. Mathf类提 ...
- log4net 将日志写入数据库
asp.net利用log4net写入日志到SqlServer数据库,Log4net是一个开源的错误日志记录项目,易用性强,源自log4j,品质值得信赖. 下面就我的安装部署log4net到MS sql ...
- 记录一次Jmeter性能测试
一.引言 之前有总结过如何写Java请求测试用例类,写完测试脚本调通之后,信心满满地以为我准备好可以开始性能测试了.结果在评审测试计划的时候,当即被项目组狠狠的扇了一耳光,各种不确定的点:性能指标不明 ...
- Python脚本控制的WebDriver 常用操作 <二十二> 处理alert / confirm / prompt
测试用例场景 webdriver中处理原生的js alert confirm 以及prompt是很简单的.具体思路是使用switch_to.alert()方法定位到alert/confirm/prom ...
- Jmeter初步使用--Jmeter安装与使用
由于jmeter是开源的性能测试工具,但是使用的人较少,网络上相关资料不全面,需要自己去揣摩,因此,小编就把自己在用Jmeter时的一些小结总结出来.而loadrunner工具是商业软件,网上通常都是 ...
- java.lang.ExceptionInInitializerError的原因(转)
这个错误是说变量初始化出现问题,通常出现在静态变量尤其是单例模式.这种问题往往是初始化顺序不对造成的,下面举个简单的例子. import java.util.HashMap; import java. ...