thinkphp URL 路由簡介
簡單的說,URL 路由就是允許你在一定規則下定制你需要的 URL 樣子,以達到美化 URL ,提高用戶體驗,也有益于搜索引擎收錄的目的。
例子
原本的 URL 為:
http://www.5idev.com/index.php/Products/Show/category/5/id/123
立即學習“PHP免費學習筆記(深入)”;
該 URL 的本意是顯示第 5 分類中 id 為 123 的產品。經過 URL 路由改寫后 URL 可以為:
http://www.5idev.com/index.php/product/5/123
如果使用 .htaccess 文件的 Rewrite 規則再把入口文件隱藏,則上面的 URL 可以進一步簡化為:
http://www.5idev.com/product/5/123
這個 URL 地址就相對比較簡單易容。
提示:使用 Apache 的 URL Rewrite 規則也能達到 URL 定制的功能,在此就不展開了,感興趣的請參看 Apache Rewrite 相關的文章。
ThinkPHP URL 路由配置
在 ThinkPHP 中要使用 URL 路由功能,需要做如下配置:
在項目配置文件 Conf/config.php 里面開啟路由功能(設置為 true):
‘URL_ROUTER_ON’ => true,
路由規則定義
與 2.x 版本不同,3.0 路由規則定義于項目配置文件 config.php 內,格式為數組格式,具體定義規則又分為規則路由和正則路由。規則路由語法如下:
格式1:’路由規則’=>'[分組/模塊/操作]?額外參數1=值1&額外參數2=值2…’
格式2:’路由規則’=>array(‘[分組/模塊/操作]’,’額外參數1=值1&額外參數2=值2…’)
格式3:’路由規則’=>’外部地址’
格式4:’路由規則’=>array(‘外部地址’,’重定向代碼’)
語法說明
路由規則即是我們要在 URL 中顯示出來規則,后面元素值部分是實際的 URL 地址及參數路由規則中如果以 : 開頭,表示動態變量,否則為靜態地址格式2的額外參數可以傳入數組或者字符串路由規則支持變量的數字約束定義,例如:’product/:idd’=>’Products/Show’路由規則非數字變量支持排除,例如 ‘news/:cate^add|edit|delete’=>’News/category’路由規則支持完整匹配定義,例如:’product/:idd$’=>’Products/Show’路由規則中的靜態地址部分不區分大小寫外部地址中如果要引用動態變量, 采用 :1、:2 的方式規則路由可以支持 全動態和動靜結合定義,例如 ‘:user/blog/:id’=>’Home/Blog/user’
這些規則及語法說明比較晦澀難懂,下面會有實例來對照以便理解上述路由規則及語法說明。
如果在配置文件里定義了路由開啟功能,系統在執行 Dispatch 解析的時候,會判斷當前 URL 是否存在定義的路由名稱,如果有就會按照定義的路由規則來進行 URL 解析。
ThinkPHP URL 路由實例
以本文開始的例子為例,看該路由是如何定義的。在項目配置文件 Conf/config.php 里定義如下規則:
//路由定義
‘URL_ROUTE_RULES’=> array(
? ?‘product/:categoryd/:idd’=>’Products/Show’, //規則路由
),
當我們訪問如下這個地址的時候:
http://www.5idev.com/index.php/product/5/123
會將該地址解析到 Products 模塊的 Show 操作,并傳入 get 參數 category=5&id=123。
如果有額外的固定參數,如 status=1,可以定義路由:
‘product/:categoryd/:idd’=>’Products/Show?status=1’, //規則路由
也即匹配下面這個 URL 地址:
http://www.5idev.com/index.php/product/5/123/1
上面都是按格式1來定義的路由,在有額外參數的情況下,可以轉換為第2種定義格式:
‘product/:categoryd/:idd’=>array(‘Products/Show’,’status=1′)
上面的路由規則中 d 表示只匹配數字,當不加此約束時,則可匹配所有字符,這也是默認情況。如果要嚴格約定傳入的參數格式,請使用正則路由定義規則。
路由格式:外部地址
對于路由格式 3 和格式 4,則是檢測到匹配的路由格式,則跳轉到外部地址,區別是格式 4 有重定向代碼,如 301 代表永久重定向。
更多ThinkPHP相關技術文章,請訪問ThinkPHP使用教程欄目進行學習!