## 启用路由
要使用路由功能,前提是你的URL支持PATH_INFO(或者兼容URL模式也可以,采用普通URL模式的情况下不支持路由功能),并且在应用(或者模块)配置文件中开启路由:
~~~
// 开启路由
'URL_ROUTER_ON' => true,
~~~
> 路由功能可以针对模块,也可以针对全局,针对模块的路由则需要在模块配置文件中开启和设置路由,如果是针对全局的路由,则是在公共模块的配置文件中开启和设置(后面我们以模块路由定义为例)。
然后就是配置路由规则了,在模块的配置文件中使用**URL_ROUTE_RULES**参数进行配置,配置格式是一个数组,每个元素都代表一个路由规则,例如:
~~~
'URL_ROUTE_RULES'=>array(
'news/:year/:month/:day' => array('News/archive', 'status=1'),
'news/:id' => 'News/read',
'news/read/:id' => '/news/:1',
),
~~~
系统会按定义的顺序依次匹配路由规则,一旦匹配到的话,就会定位到路由定义中的控制器和操作方法去执行(可以传入其他的参数),并且后面的规则不会继续匹配。
## 路由定义
路由规则的定义格式为: **'路由表达式'=>'路由地址和传入参数'**
或者:**array('路由表达式','路由地址','传入参数')**
> 模块路由和全局路由配置的区别在于,全局路由的路由地址必须包含模块。
##### 路由表达式
路由表达式包括规则路由和正则路由的定义表达式,只能使用字符串。
| 表达式 | 示例 |
|-----|-----|
| 正则表达式 | /^blog\/(\d+)$/ |
| 规则表达式 | blog/:id |
> 详细的规则路由和正则路由表达式的定义方法参考后面的章节。
##### 路由地址
路由地址(可以支持传入额外参数)表示前面的路由表达式需要路由到的地址(包括内部地址和外部地址),并且允许隐式传入URL里面没有的一些参数,这里允许使用字符串或者数组方式定义,特殊情况下还可以采用闭包函数定义路由功能,支持下面6种方式定义:
| 定义方式 | 定义格式 |
|-----|-----|
| 方式1:路由到内部地址(字符串) | '[控制器/操作]?额外参数1=值1&额外参数2=值2...' |
| 方式2:路由到内部地址(数组)参数采用字符串方式 | array('[控制器/操作]','额外参数1=值1&额外参数2=值2...') |
| 方式3:路由到内部地址(数组)参数采用数组方式 | array('[控制器/操作]',array('额外参数1'=>'值1','额外参数2'=>'值2'...)[,路由参数]) |
| 方式4:路由到外部地址(字符串)301重定向 | '外部地址' |
| 方式5:路由到外部地址(数组)可以指定重定向代码 | array('外部地址','重定向代码'[,路由参数]) |
| 方式6:闭包函数 | function($name){ echo 'Hello,'.$name;} |
如果你定义的是全局路由(在公共模块的配置文件中定义),那么路由地址的定义格式中需要增加模块名,例如:
~~~
'blog/:id'=>'Home/blog/read' // 表示路由到Home模块的blog控制器的read操作方法
~~~
如果路由地址以“/”或者“http”开头则会认为是一个重定向地址或者外部地址,例如:
~~~
'blog/:id'=>'/blog/read/id/:1'
~~~
和
~~~
'blog/:id'=>'blog/read'
~~~
虽然都是路由到同一个地址,但是前者采用的是301重定向的方式路由跳转,这种方式的好处是URL可以比较随意(包括可以在URL里面传入更多的非标准格式的参数),而后者只是支持模块和操作地址。
举个例子,如果我们希望 `avatar/123` 重定向到 `/member/avatar/id/123_small` 的话,只能使用:
~~~
'avatar/:id'=>'/member/avatar/id/:1_small'
~~~
路由地址采用重定向地址的话,如果要引用动态变量,也是采用 `:1、:2` 的方式。
采用重定向到外部地址通常对网站改版后的URL迁移过程非常有用,例如:
~~~
'blog/:id'=>'http://blog.thinkphp.cn/read/:1'
~~~
表示当前网站(可能是http://thinkphp.cn)的 `blog/123` 地址会直接重定向到 `http://blog.thinkphp.cn/read/123`。
默认情况下,外部地址的重定向采用301重定向,如果希望采用其它的,可以使用:
~~~
'blog/:id'=>array('http://blog.thinkphp.cn/read/:1',302);
~~~
在路由跳转的时候支持额外传入参数对(额外参数指的是不在URL里面的参数,隐式传入需要的操作中,有时候能够起到一定的安全防护作用,后面我们会提到),支持 `额外参数1=值1&额外参数2=值2` 或者 `array('额外参数1'=>'值1','额外参数2'=>'值2'...)` 这样的写法,可以参考不同的定义方式选择。例如:
~~~
'blog/:id'=>'blog/read?status=1&app_id=5',
'blog/:id'=>array('blog/read?status=1&app_id=5'),
'blog/:id'=>array('blog/read','status=1&app_id=5'),
'blog/:id'=>array('blog/read',array('status'=>1,'app_id'=>5)),
~~~
上面的路由规则定义中额外参数的传值方式都是等效的。`status`和`app_id`参数都是URL里面不存在的,属于隐式传值,当然并不一定需要用到,只是在需要的时候可以使用。
## 路由参数
当路由地址采用数组方式定义的时候,还可以传入额外的路由参数。
> 这些参数的作用是限制前面定义的路由规则的生效条件。
### 限制URL后缀
例如:
~~~
'blog/:id'=>array('blog/read','status=1&app_id=5',array('ext'=>'html')),
~~~
就可以限制html后缀访问该路由规则才能生效。
### 限制请求类型
例如:
~~~
'blog/:id'=>array('blog/read','status=1&app_id=5',array('method'=>'get')),
~~~
就限制了只有GET请求该路由规则才能生效。
### 自定义检测
支持自定义检测,例如: 例如:
~~~
'blog/:id'=>array('blog/read','status=1&app_id=5',array('callback'=>'checkFun')),
~~~
就可以自定义checkFun函数来检测是否生效,如果函数返回false则表示不生效。
- 序言
- 基础
- 获取ThinkPHP
- 环境要求
- 目录结构
- 入口文件
- 自动生成
- 模块
- 控制器
- 开发规范
- 配置
- 配置格式
- 配置加载
- 读取配置
- 动态配置
- 扩展配置
- 批量配置
- 架构
- 模块化设计
- URL模式
- 多层MVC
- CBD模式
- 命名空间
- 自动加载
- 应用模式
- 项目编译
- 系统流程
- 路由
- 路由定义
- 规则路由
- 正则路由
- 静态路由
- 闭包支持
- 实例说明
- 控制器
- 控制器定义
- 前置和后置操作
- Action参数绑定
- 伪静态
- URL大小写
- URL生成
- AJAX返回
- 跳转和重定向
- 输入变量
- 请求类型
- 空操作
- 空控制器
- 插件控制器
- 操作绑定到类
- 模型
- 模型定义
- 模型实例化
- 字段定义
- 连接数据库
- 切换数据库
- 分布式数据库支持
- 连贯操作
- WHERE
- TABLE
- ALIAS
- DATA
- FIELD
- ORDER
- LIMIT
- PAGE
- GROUP
- HAVING
- JOIN
- UNION
- DISTINCT
- LOCK
- CACHE
- COMMENT
- RELATION
- USING
- fetchSql
- TOKEN
- STRICT
- INDEX
- 命名范围
- CURD操作
- 数据创建
- 数据写入
- 数据读取
- 数据更新
- 数据删除
- ActiveRecord
- 字段映射
- 查询语言
- 查询方式
- 表达式查询
- 快捷查询
- 区间查询
- 组合查询
- 统计查询
- SQL查询
- 动态查询
- 子查询
- 自动验证
- 自动完成
- 参数绑定
- 虚拟模型
- 模型分层
- 视图模型
- 关联模型
- 高级模型
- Mongo模型
- 视图
- 模板定义
- 模板主题
- 模板赋值
- 模板渲染
- 获取模板地址
- 获取内容
- 模板引擎
- 模板
- 变量输出
- 系统变量
- 使用函数
- 默认值输出
- 使用运算符
- 标签库
- 模板继承
- 修改定界符
- 三元运算
- 包含文件
- 内置标签
- Volist标签
- Foreach标签
- For标签
- Switch标签
- 比较标签
- 范围判断标签
- IF标签
- Present标签
- Empty标签
- Defined标签
- Assign标签
- Define标签
- 标签嵌套
- import标签
- 使用PHP代码
- 原样输出
- 模板注释
- 模板布局
- 模板替换
- 调试
- 调试模式
- 异常处理
- 日志记录
- 页面Trace
- Trace方法
- 变量调试
- 性能调试
- 错误调试
- 模型调试
- 缓存
- 数据缓存
- 快速缓存
- 查询缓存
- 静态缓存
- 安全
- 输入过滤
- 表单合法性检测
- 表单令牌
- 防止SQL注入
- 目录安全文件
- 保护模板文件
- 上传安全
- 防止XSS攻击
- 其他安全建议
- 扩展
- 类库扩展
- 驱动扩展
- 缓存驱动
- 数据库驱动
- 日志驱动
- Session驱动
- 存储驱动
- 模板引擎驱动
- 标签库驱动
- 行为扩展
- 标签扩展
- Widget扩展
- 应用模式
- 部署
- PATH_INFO支持
- URL重写
- 模块部署
- 域名部署
- 入口绑定
- 替换入口
- 专题
- SESSION支持
- Cookie支持
- 多语言支持
- 数据分页
- 文件上传
- 验证码
- 图像处理
- RESTFul
- RPC
- SAE
- IP获取和定位
- 附录
- 常量参考
- 配置参考
- 升级指导
- 鸣谢