# URI 路由
一般情況下,一個 URL 字符串和它對應的控制器中類和方法是一一對應的關系。 URL 中的每一段通常遵循下面的規則:
~~~
example.com/class/function/id/
~~~
但是有時候,你可能想改變這種映射關系,調用一個不同的類和方法,而不是 URL 中對應的那樣。
例如,假設你希望你的 URL 變成下面這樣:
~~~
example.com/product/1/
example.com/product/2/
example.com/product/3/
example.com/product/4/
~~~
URL 的第二段通常表示方法的名稱,但在上面的例子中,第二段是一個商品 ID , 為了實現這一點,CodeIgniter 允許你重新定義 URL 的處理流程。
## 設置你自己的路由規則
路由規則定義在?application/config/routes.php?文件中,在這個文件中你會 發現一個名為?$route?的數組,利用它你可以設置你自己的路由規則。 在路由規則中你可以使用通配符或正則表達式。
## 通配符
一個典型的使用通配符的路由規則如下:
~~~
$route['product/:num'] = 'catalog/product_lookup';
~~~
在一個路由規則中,數組的鍵表示要匹配的 URI ,而數組的值表示要重定向的位置。 上面的例子中,如果 URL 的第一段是字符串 "product" ,第二段是個數字,那么, 將調用 "catalog" 類的 "product_lookup" 方法。
你可以使用純字符串匹配,或者使用下面兩種通配符:
**(:num)**?匹配只含有數字的一段。?**(:any)**?匹配含有任意字符的一段。(除了 '/' 字符,因為它是段與段之間的分隔符)
> 注解
> 通配符實際上是正則表達式的別名,**:any**?會被轉換為?**[^/]+**?,?**:num**?會被轉換為?**[0-9]+**?。
> 注解
> 路由規則將按照它們定義的順序執行,前面的規則優先級高于后面的規則。
> 注解
> 路由規則并不是過濾器!設置一個這樣的路由:'foo/bar/(:num)' ,?Foo?控制器的?bar?方法還是有可能會通過一個非數字的參數被調用 (如果這個路由也是合法的話)。
## 例子
這里是一些路由的例子:
~~~
$route['journals'] = 'blogs';
~~~
URL 的第一段是單詞 "journals" 時,將重定向到 "blogs" 類。
~~~
$route['blog/joe'] = 'blogs/users/34';
~~~
URL 包含 blog/joe 的話,將重定向到 "blogs" 類和 "users" 方法。ID 參數設為 "34" 。
~~~
$route['product/(:any)'] = 'catalog/product_lookup';
~~~
URL 的第一段是 "product" ,第二段是任意字符時,將重定向到 "catalog" 類的 "product_lookup" 方法。
~~~
$route['product/(:num)'] = 'catalog/product_lookup_by_id/$1';
~~~
URL 的第一段是 "product" ,第二段是數字時,將重定向到 "catalog" 類的 "product_lookup_by_id" 方法,并將第二段的數字作為參數傳遞給它。
>[danger] 重要
> 不要在前面或后面加反斜線('/')。
## 正則表達式
如果你喜歡,你可以在路由規則中使用正則表達式。任何有效的正則表達式都是 允許的,包括逆向引用。
>[info] 注解
> 如果你使用逆向引用,你需要使用美元符號代替雙斜線語法。
一個典型的使用正則表達式的路由規則看起來像下面這樣:
~~~
$route['products/([a-z]+)/(\d+)'] = '$1/id_$2';
~~~
上例中,一個類似于 products/shirts/123 這樣的 URL 將會重定向到 "shirts" 控制器的 "id_123" 方法。
使用正則表達式,你還可以匹配含有反斜線字符('/')的段,它通常來說是 多個段之間的分隔符。
例如,當一個用戶訪問你的 Web 應用中的某個受密碼保護的頁面時,如果他沒有 登陸,會先跳轉到登陸頁面,你希望在他們在成功登陸后重定向回剛才那個頁面, 那么這個例子會很有用:
~~~
$route['login/(.+)'] = 'auth/login/$1';
~~~
如果你還不知道正則表達式,可以訪問?regular-expressions.info ?開始學習一下。
>[info] 注解
> 你也可以在你的路由規則中混用通配符和正則表達式。
## 回調函數
如果你正在使用的 PHP 版本高于或等于 5.3 ,你還可以在路由規則中使用回調函數來處理逆向引用。 例如:
~~~
$route['products/([a-zA-Z]+)/edit/(\d+)'] = function ($product_type, $id)
{
return 'catalog/product_edit/' . strtolower($product_type) . '/' . $id;
};
~~~
## 在路由中使用 HTTP 動詞
還可以在你的路由規則中使用 HTTP 動詞(請求方法),當你在創建 RESTful 應用時特別有用。 你可以使用標準的 HTTP 動詞(GET、PUT、POST、DELETE、PATCH),也可以使用自定義的動詞 (例如:PURGE),不區分大小寫。你需要做的就是在路由數組后面再加一個鍵,鍵名為 HTTP 動詞。例如:
~~~
$route['products']['put'] = 'product/insert';
~~~
上例中,當發送 PUT 請求到 "products" 這個 URI 時,將會調用?Product::insert()?方法。
~~~
$route['products/(:num)']['DELETE'] = 'product/delete/$1';
~~~
當發送 DELETE 請求到第一段為 "products" ,第二段為數字這個 URL時,將會調用?Product::delete()?方法,并將數字作為第一個參數。
當然,使用 HTTP 動詞是可選的。
## 保留路由
有下面三個保留路由:
~~~
$route['default_controller'] = 'welcome';
~~~
這個路由表示當用戶不帶任何參數直接訪問你的網站時該加載哪個控制器, 上例中,將會加載 "welcome" 類。你應該永遠都有個默認的路由,要不然 會顯示 404 頁面。
~~~
$route['404_override'] = '';
~~~
這個路由表示當用戶請求了一個不存在的頁面時該加載哪個控制器,它將會覆蓋 默認的 404 錯誤頁面。show_404()?函數不會受影響,它還是會繼續加載?application/views/errors/?目錄下的默認的?error_404.php?文件。
~~~
$route['translate_uri_dashes'] = FALSE;
~~~
從它的布爾值就能看出來這其實并不是一個路由,這個選項可以自動的將 URL 中的控制器和方法中的連字符('-')轉換為下劃線('_'),當你需要這樣時, 它可以讓你少寫很多路由規則。由于連字符不是一個有效的類名或方法名, 如果你不使用它的話,將會引起一個嚴重錯誤。
>[danger] 重要
> 保留的路由規則必須位于任何一般的通配符或正則路由的前面。
- 歡迎使用 CodeIgniter
- 安裝說明
- 下載 CodeIgniter
- 安裝說明
- 從老版本升級
- 疑難解答
- CodeIgniter 概覽
- CodeIgniter 將從這里開始
- CodeIgniter 是什么?
- 支持特性
- 應用程序流程圖
- 模型-視圖-控制器
- 設計與架構目標
- 教程 - 內容提要
- 加載靜態內容
- 讀取新聞條目
- 創建新聞條目
- 結束語
- 常規主題
- CodeIgniter URL
- 控制器
- 保留名稱
- 視圖
- 模型
- 輔助函數
- 使用 CodeIgniter 類庫
- 創建類庫
- 使用 CodeIgniter 驅動器
- 創建驅動器
- 創建核心系統類
- 創建附屬類
- 鉤子 - 擴展框架核心
- 自動加載資源
- 公共函數
- 兼容性函數
- URI 路由
- 錯誤處理
- 網頁緩存
- 程序分析
- 以 CLI 方式運行
- 管理你的應用程序
- 處理多環境
- 在視圖文件中使用 PHP 替代語法
- 安全
- PHP 開發規范
- 類庫參考
- 基準測試類
- 緩存驅動器
- 日歷類
- 購物車類
- 配置類
- Email 類
- 加密類
- 加密類(新版)
- 文件上傳類
- 表單驗證類
- FTP 類
- 圖像處理類
- 輸入類
- Javascript 類
- 語言類
- 加載器類
- 遷移類
- 輸出類
- 分頁類
- 模板解析類
- 安全類
- Session 類
- HTML 表格類
- 引用通告類
- 排版類
- 單元測試類
- URI 類
- 用戶代理類
- XML-RPC 與 XML-RPC 服務器類
- Zip 編碼類
- 數據庫參考
- 數據庫快速入門: 示例代碼
- 數據庫配置
- 連接你的數據庫
- 查詢
- 生成查詢結果
- 查詢輔助函數
- 查詢構造器類
- 事務
- 數據庫元數據
- 自定義函數調用
- 數據庫緩存類
- 數據庫工廠類
- 數據庫工具類
- 數據庫驅動器參考
- 輔助函數參考
- 數組輔助函數
- 驗證碼輔助函數
- Cookie 輔助函數
- 日期輔助函數
- 目錄輔助函數
- 下載輔助函數
- 郵件輔助函數
- 文件輔助函數
- 表單輔助函數
- HTML 輔助函數
- 語言輔助函數
- Inflector 輔助函數
- 數字輔助函數
- 路徑輔助函數
- 安全輔助函數
- 表情輔助函數
- 字符串輔助函數
- 文本輔助函數
- 排版輔助函數
- URL 輔助函數
- XML 輔助函數
- 向 CodeIgniter 貢獻你的力量