ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 路由定义 [上一页](# "上一页")[下一页](# "下一页") ### 启用路由 要使用路由功能,前提是你的URL支持PATH_INFO(或者兼容URL模式也可以,采用普通URL模式的情况下不支持路由功能),并且在应用(或者模块)配置文件中开启路由: ~~~ // 开启路由 'URL_ROUTER_ON' => true, ~~~ > 3.2的路由功能是针对模块设置的,所以URL中的模块名不能被路由,路由定义也通常是放在模块配置文件中。 然后就是配置路由规则了,在模块的配置文件中使用**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;} | 如果路由地址以“/”或者“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则表示不生效。 [上一页](# "上一页")[下一页](# "下一页")