几个概念:

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中。

路由规则:

首先在配置文件中开启路由,"URL_ROUTER_ON"=>true;
然后定义路由规则,路由规则也在配置文件中,参数名为 URL_ROUTE_RULES ,它是一个数组。
假设我们打开一个url:http://localhost/index.php/
list/2/p/1 ,我们需要访问id为1分类列表页,并且p是页码,第一页。
PATHINFO字符串为:
list/2/p/1 
我们需要将它定位到 listAction.class.php 模块中的 index方法,以及将p作为分页参数写入到$_GET中
定义路由:
'URL_ROUTE_RULES'=>array(
'list/:id/p/:p'=>'Home/list/index'

),
这样PATHINFO中的2将被写入到$_GET['id']=2, 同时 p 对应$_GET['p']=1 ,规则重定向到Home分组下的list模块index方法,我们只需要在index方法中直接获取$_GET['id'],以及$_GET['p']即可,实际访问效果等同于  http://localhost/index.php/Home/list/index?id=2&p=1
假如我们要严格限定id和p的类型是数字,那么我们应该这样做
'list/:id
\d/p/:p
\d'=>'Home/list/index'
\d表示数字类型。

复杂一点的,假如PATHINFO为  
del/10 。要调用article模块下的del方法,并将10作为id传递给它
规则应该这样写
“:a/:id\d”=>'Home/article/
:1'
首先,将del这一段作为一个变量去匹配,:a :b都可以,10也作为一个变量,指定为:id 并且类型要求是整型。在右侧router中,通过:1可以使用左侧第一个变量,:2 :3依次类推。
再假设,我们禁止匹配
add/10中的add,规则只需要稍加改动,如下:
“:a^add/:id\d”=>'Home/article/
:1'
如果要禁止多个关键词,则只需要用
|拼接,比如 ^add|del|get 

如果右侧router默认需要带有参数,可以直接将参数加在?后面,比如
“:a^add/:id\d”=>'Home/article/
:1?p=1'

也可以将右侧router写成数组形式,比如
“:a^add/:id\d”=>array('Home/article/:1','p=1&p1=2&p3=3')


如果你需要
完整匹配整个PATHINFO,只需要在rule的结尾加上
$,比如
list/:id$ 可以匹配 list/10,但是无法匹配list/10/p/1
把$拿掉则都可以匹配。


上面所讲的都是我们程序内部重定向,实际URL并不会发生跳转,如果我们想做一个redirect的跳转,只需要右侧router以http://开头或者以 '/' 开头即可。

比如
'list/:id'=>'/artlist/:1' 
这样当我们访问 http://localhost/list/10的时候,浏览器会发生跳转,跳转到 http://localhost/artlist/10

以上是TP自定定义的一些规则,那么当以上规则无法满足你的复杂需求时怎么办?
正则路由可以帮助你 。

正则路由与普通路由的区别是,左侧rule不需要记住复杂的语法,我们只需要根据正则语法,直接匹配PATHINFO,右侧通过 :1 :2 :3调用即可。

比如
'/^list\/(\d+)/is'=>'Home/artlist/index?id=:1'

注意事项:
1.路由不会循环匹配,当匹配一次以后将跳出循环。
2.当路由中同时包含 ^排除关键字 和 \指定类型的时候,应当将 ^放在\前面,比如 :d^add|del\s  




ThinkPHP中URL解析原理,以及URL路由使用教程!的更多相关文章

  1. ThinkPHP中的pathinfo模式和URL重写

    语文一直不太好,要我怎么解释这个pathinfo模式还真不知道怎么说,那就先来一段代码说下pathinfo模式吧 http://serverName/appName/module/action/id/ ...

  2. Thinkphp中路由Url获取的使用方法

    Thinkphp是一个体系较为完整的框架,很多地方比国外的框架功能都全,唯一不喜之处是性能,和传说中的.NET有点像. Thinkphp提供较全url处理体系,通过同一规则实现Url的路由和Url生成 ...

  3. 在ASP.NET非MVC环境中(WebForm中)构造MVC的URL参数,以及如何根据URL解析出匹配到MVC路由的Controller和Action

    目前项目中有个需求,需要在WebForm中去构造MVC的URL信息,这里写了一个帮助类可以在ASP.NET非MVC环境中(WebForm中)构造MVC的URL信息,主要就是借助当前Http上下文去构造 ...

  4. ThinkPHP中pathinfo模式与URL重写

    Thinkphp中的pathinfo模式 http://serverName/appName/module/action/id/1/ pathinfo模式 在不考虑路由的情况下,第一个参数会被解析成模 ...

  5. thinkphp中URL传参数的几种方式

    在thinkphp中,url传参合asp.net中原理类似,下面就单个参数和多个参数传递方式进行一个简单讲解 1.传单个参数 单个参数这种比较简单,例如 想像edit操作里面传递一个id值,如下写法_ ...

  6. java网络编程客户端与服务端原理以及用URL解析HTTP协议

    常见客户端与服务端 客户端: 浏览器:IE 服务端: 服务器:web服务器(Tomcat),存储服务器,数据库服务器. (注:会用到Tomact服务器,在webapps下有一个自己创建的目录myweb ...

  7. 域名解析中的cname解析和显性URL跳转和隐性URL跳转三者有什么区别

    通俗的来讲,cname解析还是属于dns解析,只是把某个域名解析到另外一个域名对应的某个IP的空间中,所以还需要在服务器端(比如nginx)做域名解析(比如把baidu.com做一个cname解析到i ...

  8. ThinkPHP中U方法与url的四种访问模式

     ThinkPHP中U方法的用处主要是完成对url地址的组装,在模板中使用U方法而不是固定写死URL地址的好处在于,一旦你的环境变化或者参数设置改变,你不需要更改模板中的任何代码.在模板中的调用格式需 ...

  9. 「Python 编程」编码实现网络请求库中的 URL 解析器

    摘要:怎么写出更短的代码并不是这次要讨论的话题.今天我们来研究一下:运行代码的计算机是如何找到目标服务器的? 相信各位 Python 开发者都用过 Requests 库,有些朋友还用过 WebSock ...

随机推荐

  1. Linux C/C++ 编程练手 --- 大数相加和大数相乘

    最近写了一个大数相乘和相加的程序,结果看起来是对的.不过期间的效率可能不是最好的,有些地方也是临时为了解决问题而直接写出来的. 可以大概说一下相乘和相加的解决思路(当然,大数操作基本就是两个字符串的操 ...

  2. 手机通过WIFI连上ZXV10 H618B路由器但不能上网问题的解决

    前几天朋友帮忙拿到一个ZXV10 H618B路由器,一看需要12V供电,还好以前留下一个12V输出的DC充电器,关键时刻用上了,先大概下载了此路由器的用户手册,发现原来是08年的产品,都5年了. 开始 ...

  3. POJ 1552 Doubles (C++ STL set使用)

    题目: 题意:题意:给出几个正数(2~15个),然后就是求有这些数字的2倍有没有和原先的正数相同的,求出有几个,没有就是0. 分析:水题.用数组解决,开一个数组存正数,另开一个数组用来存这些数的2倍, ...

  4. lnmp 安装环境之后discuz论坛排版乱的问题

    服务器系统类型:centos 6.5 环境:使用lnmp官方安装shell安装 (http://lnmp.org/install.html) 在部署dz之后,访问页面 出现排版乱,资源不能加载的问题: ...

  5. 微软 Virtual studion Code

    在 Build 2015 大会上,微软除了发布了 Microsoft Edge 浏览器和新的 Windows 10 预览版外,最大的惊喜莫过于宣布推出免费跨平台的 Visual Studio Code ...

  6. jquery M97-datepicker日历控件

    My97DatePicker是一款非常灵活好用的日期控件.使用非常简单. 1.下载My97DatePicker组件包 2.在页面中引入该组件js文件:     <script type=&quo ...

  7. 转换Json格式帮助类

    using System; using System.Collections.Generic; using System.Text; using System.Reflection; using Sy ...

  8. asp.net文本编辑器(FCKeditor)

    FCKeditor介绍 FCKeditor是一个功能强大支持所见即所得功能的文本编辑器,可以为用户提供微软office软件一样的在线文档编辑服务.它不需要安装任何形式的客户端,兼容绝大多数主流浏览器, ...

  9. Python环境变量设置

    在Windows环境下安装了python后,为了方便运行.py文件,可以设置环境变量如下: 环境变量位置 添加值 添加后效果 系统变量中的PATH python.exe所在目录,比如D:\Python ...

  10. bzoj 2154 Crash的数字表格(莫比乌斯反演及优化)

    Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如 ...