5.8 URL路由
匿名 · 更新于 2013/12/24
ThinkPHP支持URL路由功能,要启用路由功能,需要设置URL_ROUTER_ON 参数为true。开启路由功能后,并且配置URL_ROUTE_RULES参数后,系统会自动进行路由检测,如果在路由定义里面找到和当前URL匹配的路由名称,就会进行路由解析和重定向。
3.0版本的路由支持做了增强,包含规则路由和正则路由支持。
一、规则路由
规则路由是由2.1版本的简单路由进化而来,定义格式为:
格式1:'路由规则'=>'[分组/模块/操作]?额外参数1=值1&额外参数2=值2...'
格式2:'路由规则'=>array('[分组/模块/操作]','额外参数1=值1&额外参数2=值2...')
格式3:'路由规则'=>'外部地址'
格式4:'路由规则'=>array('外部地址','重定向代码')
注意事项:
3.0版本的路由支持做了增强,包含规则路由和正则路由支持。
一、规则路由
规则路由是由2.1版本的简单路由进化而来,定义格式为:
格式1:'路由规则'=>'[分组/模块/操作]?额外参数1=值1&额外参数2=值2...'
格式2:'路由规则'=>array('[分组/模块/操作]','额外参数1=值1&额外参数2=值2...')
格式3:'路由规则'=>'外部地址'
格式4:'路由规则'=>array('外部地址','重定向代码')
注意事项:
- 路由规则中如果以“:”开头,表示动态变量,否则为静态地址
- 格式2的额外参数可以传入数组或者字符串
- 外部地址中如果要引用动态变量, 采用 :1、:2 的方式
- 路由规则支持变量的数字约束定义,例如:'news/:id\d'=>'News/read'
- 规则路由可以支持 全动态和动静结合定义,例如':user/blog/:id'=>'Home/Blog/user'
- 路由规则非数字变量支持排除,例如 'news/:cate^add|edit|delete'=>'News/category'
- 路由规则中的静态地址部分不区分大小写
5
下面是规则路由的定义示例:
如果我们访问下面的URL
第一条路由规则还可以改成
第三条路由规则是一个路由重定向,一般是用于网站改版后的URL迁移,如果之前的URL访问规则是
有些情况下,可能会存在冲突,假如要支持通过标识来访问文章,
而 news/:name 规则定义 则会匹配所有的字符情况,这也是默认的情况,目前规则路由只区分数字和所有字符的情况,如果需要严格的类型约束,请采用正则路由定义规则。
'URL_ROUTER_ON' => true, //开启路由'URL_ROUTE_RULES' => array( //定义路由规则'news/:year/:month/:day' => array('News/archive', 'status=1'),'news/:id' => 'News/read','news/read/:id' => '/news/:1',),
http://serverName/index.php/news/8http://serverName/index.php/news/10
如果我们访问下面的URL
http://serverName/index.php/news/2012/01/08http://serverName/index.php/news/2012/01/15
第一条路由规则还可以改成
'news/:year/:month/:day/'=>'News/archive?status=1',
第三条路由规则是一个路由重定向,一般是用于网站改版后的URL迁移,如果之前的URL访问规则是
http://serverName/index.php/news/read/8
http://serverName/index.php/news/8
有些情况下,可能会存在冲突,假如要支持通过标识来访问文章,
http://serverName/index.php/news/hello_world
'URL_ROUTER_ON' => true, //开启路由'URL_ROUTE_RULES' => array( //定义路由规则'news/:year/:month/:day' => array('News/archive', 'status=1'),'news/:id\d' => 'News/read','news/:name' => 'News/read','news/read/:id' => '/news/:1',),
而 news/:name 规则定义 则会匹配所有的字符情况,这也是默认的情况,目前规则路由只区分数字和所有字符的情况,如果需要严格的类型约束,请采用正则路由定义规则。
4
举个例子,我们现在用规则路由来实现之前用空操作实现的城市功能,我们定义了City控制器如下:
接下来,我们就可以在浏览器里面输入
http://serverName/index.php/City/beijing/
http://serverName/index.php/City/shanghai/
http://serverName/index.php/City/shenzhen/
会看到依次输出的结果是:
当前城市:beijing
当前城市:shanghai
当前城市:Shenzhen
class CityAction extends Action{public function city(){//读取城市名$cityName = $_GET['name'];echo '当前城市' . $cityName;}}
'city/:name' =>'City/city'
接下来,我们就可以在浏览器里面输入
http://serverName/index.php/City/beijing/
http://serverName/index.php/City/shanghai/
http://serverName/index.php/City/shenzhen/
会看到依次输出的结果是:
当前城市:beijing
当前城市:shanghai
当前城市:Shenzhen
2
规则路由可以支持动态和静态混合甚至是全动态,例如:
http://serverName/index.php/user1/blog/25/
http://serverName/index.php/username2/blog/245/
并解析到Blog模块的read操作方法 ,传入user和id两个GET参数。
第二条路由会匹配到下面的URL访问
http://serverName/index.php/user1/hello_world
http://serverName/index.php/username2/test_nme
同样解析到Blog模块的read操作方法,只是传入的参数变成blog_name 一个GET参数。
'URL_ROUTER_ON' => true, //开启路由'URL_ROUTE_RULES' => array( //定义路由规则':user/bolg/:id' => 'Blog/read',':user/:blog_name' => 'Blog/read',),
http://serverName/index.php/user1/blog/25/
http://serverName/index.php/username2/blog/245/
并解析到Blog模块的read操作方法 ,传入user和id两个GET参数。
第二条路由会匹配到下面的URL访问
http://serverName/index.php/user1/hello_world
http://serverName/index.php/username2/test_nme
同样解析到Blog模块的read操作方法,只是传入的参数变成blog_name 一个GET参数。
3
二、正则路由
正则路由可以实现更加复杂的路由定义,支持的定义格式如下:
格式1:'路由正则'=>'[分组/模块/操作]?参数1=值1&参数2=值2...'
格式2:'路由正则'=>array('[分组/模块/操作]','参数1=值1&参数2=值2...')
格式3:'路由正则'=>'外部地址'
格式4:'路由正则'=>array('外部地址','重定向代码')
注意事项:
正则路由可以实现更加复杂的路由定义,支持的定义格式如下:
格式1:'路由正则'=>'[分组/模块/操作]?参数1=值1&参数2=值2...'
格式2:'路由正则'=>array('[分组/模块/操作]','参数1=值1&参数2=值2...')
格式3:'路由正则'=>'外部地址'
格式4:'路由正则'=>array('外部地址','重定向代码')
注意事项:
- 正则路由规则必须以“/”开始和结束
- 格式2的参数可以传入数组或者字符串
- 参数值和外部地址中可以用动态变量 采用 :1、 :2 的方式
'URL_ROUTER_ON' => true, //开启路由'URL_ROUTE_RULES' => array( //定义路由规则'/^blog\/(\d+)$/' => 'Blog/read?id=:1','/^blog\/(\d+)\/(\d+)$/' => 'Blog/achive?year=:1&month=:2','/^blog\/(\d+)_(\d+)$/' => 'blog.php?id=:1&page=:2',),
