## 啟用路由
要使用路由功能,前提是你的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獲取和定位
- 附錄
- 常量參考
- 配置參考
- 升級指導
- 鳴謝