# URL路由
[上一页](# "上一页")[下一页](# "下一页")
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('外部地址','重定向代码')
**注意事项**:
- 路由规则中如果以“:”开头,表示动态变量,否则为静态地址
- 格式2的额外参数可以传入数组或者字符串
- 外部地址中如果要引用动态变量, 采用 :1、:2 的方式
- 路由规则支持变量的数字约束定义,例如:'news/:id\d'=>'News/read'
- 规则路由可以支持 全动态和动静结合定义,例如':user/blog/:id'=>'Home/Blog/user'
- 路由规则非数字变量支持排除,例如 'news/:cate^add|edit|delete'=>'News/category'
- 路由规则中的静态地址部分不区分大小写
下面是规则路由的定义示例:`'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',
),`其中定义了3条路由规则,如果我们访问下面的URL`http://serverName/index.php/news/8
http://serverName/index.php/news/10`则会匹配到第二条规则路由,并解析到News模块的read操作,而且后面的数字会传入$_GET['id']变量。
如果我们访问下面的URL`http://serverName/index.php/news/2012/01/08
http://serverName/index.php/news/2012/01/15`则会匹配到第一条规则路由,并解析到News模块的archive操作,而且会传入year、month和day的GET变量。
第一条路由规则还可以改成`'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/:id\d 规则表示当URL中id参数为数字时才会匹配
而 news/:name 规则定义 则会匹配所有的字符情况,这也是默认的情况,目前规则路由只区分数字和所有字符的情况,如果需要严格的类型约束,请采用正则路由定义规则。举个例子,我们现在用规则路由来实现之前用空操作实现的城市功能,我们定义了City控制器如下:`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规则路由可以支持动态和静态混合甚至是全动态,例如:`'URL_ROUTER_ON' => true, //开启路由
'URL_ROUTE_RULES' => array( //定义路由规则
':user/bolg/:id' => 'Blog/read',
':user/:blog_name' => 'Blog/read',
),`第一条路由会匹配下列URL访问
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参数。**二、正则路由**
正则路由可以实现更加复杂的路由定义,支持的定义格式如下:
格式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',
),`
[上一页](# "上一页")[下一页](# "下一页")
- 序言
- 1. 入门
- 1.1 简介
- 1.2 基础概念
- 1.3 获取ThinkPHP
- 1.4 环境要求
- 1.5 许可协议
- 1.6 目录结构
- 1.7 命名规范
- 1.8 MVC分层
- 1.9 CBD架构
- 1.10 特性概述
- 1.11 系统流程
- 1.12 开发流程
- 2. 入口
- 2.1 入口文件
- 2.2 项目目录
- 2.3 部署目录
- 2.4 项目编译
- 2.5 调试模式
- 3. 配置
- 3.1 配置格式
- 3.2 惯例配置
- 3.3 项目配置
- 3.4 调试配置
- 3.5 分组配置
- 3.6 读取配置
- 3.7 动态配置
- 3.8 扩展配置
- 4. 函数和类库
- 4.1 函数库
- 4.2 类库
- 5. 控制器
- 5.1 URL模式
- 5.2 模块和操作
- 5.3 定义控制器
- 5.4 空操作
- 5.5 空模块
- 5.6 模块分组
- 5.7 URL伪静态
- 5.8 URL路由
- 5.9 URL重写
- 5.10 URL生成
- 5.11 URL大小写
- 5.12 前置和后置操作
- 5.13 跨模块调用
- 5.14 页面跳转
- 5.15 重定向
- 5.16 获取系统变量
- 5.17 判断请求类型
- 5.18 获取URL参数
- 5.19 AJAX返回
- 5.20 Action参数绑定
- 5.21 多层控制器支持
- 6. 模型
- 6.1 模型定义
- 6.2 模型实例化
- 6.3 字段定义
- 6.4 数据主键
- 6.5 属性访问
- 6.6 跨库操作
- 6.7 连接数据库
- 6.8 切换数据库
- 6.9 分布式数据库
- 6.10 创建数据
- 6.11 字段映射
- 6.12 连贯操作
- 6.13 CURD操作
- 6.14 ActiveRecord
- 6.15 自动验证
- 6.16 命名范围
- 6.17 自动完成
- 6.18 查询语言
- 6.19 查询锁定
- 6.20 字段排除
- 6.21 事务支持
- 6.22 高级模型
- 6.23 视图模型
- 6.24 关联模型
- 6.25 Mongo模型
- 6.26 动态模型
- 6.27 虚拟模型
- 6.28 多层模型支持
- 7. 视图
- 7.1 模板定义
- 7.2 模板赋值
- 7.3 模板输出
- 7.4 模板替换
- 7.5 获取内容
- 7.6 模板引擎
- 7.7 布局模板
- 8. 模板引擎
- 8.1 变量输出
- 8.2 系统变量
- 8.3 使用函数
- 8.4 默认值输出
- 8.5 使用运算符
- 8.6 内置标签
- 8.7 包含文件
- 8.8 导入文件
- 8.9 Volist标签
- 8.10 Foreach标签
- 8.11 For标签
- 8.12 Switch标签
- 8.13 比较标签
- 8.14 三元运算
- 8.15 范围判断标签
- 8.16 Present标签
- 8.17 Empty标签
- 8.18 Defined标签
- 8.19 Define标签
- 8.20 Assign标签
- 8.21 IF标签
- 8.22 标签嵌套
- 8.23 使用PHP代码
- 8.24 模板布局
- 8.25 模板继承
- 8.26 原样输出
- 8.27 模板注释
- 8.28 引入标签库
- 8.29 修改定界符
- 8.30 避免JS混淆
- 9. 日志
- 9.1 日志级别
- 9.2 记录方式
- 9.3 手动记录
- 10. 错误
- 10.1 异常处理
- 10.2 异常模板
- 10.3 异常显示
- 11. 调试
- 11.1 运行状态
- 11.2 页面Trace
- 11.3 调试方法
- 12. 缓存
- 12.1 缓存方式
- 12.2 动态缓存
- 12.3 缓存队列
- 12.4 快捷缓存
- 12.5 快速缓存
- 12.6 查询缓存
- 12.7 SQL解析缓存
- 12.8 静态缓存
- 13. 扩展
- 13.1 行为扩展
- 13.2 类库扩展
- 13.3 控制器扩展
- 13.4 模型扩展
- 13.5 驱动扩展
- 13.6 Widget扩展
- 13.7 模式扩展
- 13.8 引擎扩展
- 14. 安全
- 14.1 表单令牌
- 14.2 字段类型验证
- 14.3 防止SQL注入
- 14.4 输入过滤
- 14.5 上传安全
- 14.6 防止XSS攻击
- 14.7 其他安全建议
- 14.8 目录安全文件
- 14.9 保护模板文件
- 15. 性能
- 15.1 关闭调试模式
- 15.2 开启缓存
- 15.3 合并字段缓存
- 15.4 优化SQL
- 15.5 替换入口
- 15.6 前端优化
- 16. 部署
- 16.1 PATH_INFO支持
- 16.2 隐藏index.php
- 16.3 二级域名部署
- 16.4 定制错误页面
- 16.5 设置时区
- 17. SAE支持
- 17.1 SAE介绍
- 17.2 获取SAE
- 17.3 SAE开发
- 18. REST支持
- 18.1 REST介绍
- 18.2 REST模式
- 18.3 REST配置
- 18.4 REST路由
- 18.5 REST方法
- 19. 杂项
- 19.1 Session支持
- 19.2 Cookie支持
- 19.3 日期和时间
- 19.4 WML开发
- 19.5 多语言
- 19.6 数据分页
- 19.7 文件上传
- 19.8 验证码
- 19.9 图片添加水印
- 19.10 IP获取和定位
- 20. 附录
- 20.1 常量参考
- 20.2 配置参考
- 20.3 关于升级
- 20.4 大事记
- 鸣谢
- 关于