# 路由方式变量
*****
例如注册如下路由规则:
![](https://box.kancloud.cn/6813d220d45460b17a22ac58068bf654_610x398.png)
~~~
// 注册路由到home模块的lists控制器的index操作`
路由方式: lists/:id
路由规则: ["home/lists/index"]
~~~
我们访问:
~~~
http://serverName/lists/5
~~~
会自动路由到:
~~~
http://serverName/home/lists/index/id/5
~~~
并且原来的访问地址会自动失效。
### 规则表达式
规则表达式通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式:
~~~
路由方式: / 路由规则: ["home/index/index"] // 首页访问路由
路由方式: my 路由规则: ["Member/myinfo"] // 静态地址路由
路由方式: blog/:id 路由规则: ["Blog/read"] // 静态地址和动态地址结合
路由方式: news/:year/:month/:day 路由规则: ["News/read"] // 静态地址和动态地址结合
路由方式: :user/:blog_id 路由规则:["Blog/read"] // 全动态地址
~~~
### 可选定义
支持对路由参数的可选定义,例如:
~~~
路由方式:'blog/:year/[:month]
路由规则:["Blog/archive"]
~~~
变量用`[ ]`包含起来后就表示该变量是路由匹配的可选变量。
以上定义路由规则后,下面的URL访问地址都可以被正确的路由匹配:
~~~
http://serverName/index.php/blog/2015
http://serverName/index.php/blog/2015/12
~~~
采用可选变量定义后,之前需要定义两个或者多个路由规则才能处理的情况可以合并为一个路由规则。
> 可选参数只能放到路由规则的最后,如果在中间使用了可选参数的话,后面的变量都会变成可选参数。
### 完全匹配
规则匹配检测的时候默认只是对URL从头开始匹配,只要URL地址包含了定义的路由规则就会匹配成功,如果希望URL进行完全匹配,可以在路由表达式最后使用`$`符号,例如:
~~~
路由方式:new/:cate$
路由规则:["News/category"]
~~~
这样定义后
~~~
http://serverName/index.php/new/info
~~~
会匹配成功,而
~~~
http://serverName/index.php/new/info/2
~~~
则不会匹配成功。
### 额外参数
在路由跳转的时候支持额外传入参数对(额外参数指的是不在URL里面的参数,隐式传入需要的操作中,有时候能够起到一定的安全防护作用,后面我们会提到)。例如:
~~~
路由方式:blog/:id
路由规则:["blog/read?status=1&app_id=5"]
~~~
上面的路由规则定义中额外参数的传值方式都是等效的。`status`和`app_id`参数都是URL里面不存在的,属于隐式传值,当然并不一定需要用到,只是在需要的时候可以使用。
# 路由参数
*****
路由分组及规则定义支持指定路由参数,这些参数主要完成路由匹配检测以及行为执行。
| 参数 | 说明 |
| --- | --- |
| method | 请求类型检测,支持多个请求类型 |
| ext | URL后缀检测,支持匹配多个后缀 |
| deny\_ext | URL禁止后缀检测,支持匹配多个后缀 |
| https | 检测是否https请求 |
| domain | 域名检测 |
| ajax | Ajax检测 |
| pjax | Pjax检测 |
| header | 设置Response的header信息 |
| append | 追加额外的参数 |
## 使用方法:
~~~
// 检测路由规则仅GET请求有效
路由规则:["News/read",{"method":"get"}]
// 检测路由规则仅GET和POST请求有效
路由规则:["News/read",{"method":"get|post"}]
~~~
## URL后缀
// 定义GET请求路由规则 并设置URL后缀为html的时候有效`
~~~
路由规则:["News/read",{"ext":"html"}]
支持匹配多个后缀,例如:
路由规则:["News/read",{"ext":"shtml|html"}]
~~~
可以设置禁止访问的URL后缀,例如:
~~~
路由规则:["News/read",{"deny_ext":"jpg|png|gif"}]
~~~
## 域名检测
支持使用完整域名或者子域名进行检测,例如:
~~~
// 完整域名检测 只在news.thinkphp.cn访问时路由有效
路由规则:["News/read",{"domain":"news.hxkj.com"}]
// 子域名检测
路由规则:["News/read",{"domain":"news"}]
~~~
## HTTPS检测
支持检测当前是否HTTPS访问
~~~
路由规则:["News/read",{"https":"true"}]
~~~
## 设置Header信息
~~~
路由规则:["News/read",{"header":{"Access-Control-Allow-Methods":"GET, POST, PATCH, PUT, DELETE"}}]
~~~
## 追加额外的参数
~~~
路由规则:["News/read",{"append":{"status":"1","app_id":"12"}}]
~~~
上面的路由规则定义中额外参数的传值方式都是等效的。`status`和`app_id`参数都是URL里面不存在的,属于隐式传值,当然并不一定需要用到,只是在需要的时候可以使用。