規則路由
規則路由是一種比較容易理解的路由定義方式,采用ThinkPHP設計的規則表達式來定義。
規則表達式
規則表達式通常包含靜態地址和動態地址,或者兩種地址的結合,例如下面都屬於有效的規則表達式:
'my' => 'Member/myinfo', // 靜態地址路由
'blog/:id' => 'Blog/read', // 靜態地址和動態地址結合
'new/:year/:month/:day'=>'News/read', // 靜態地址和動態地址結合
':user/:blog_id' =>'Blog/read',// 全動態地址
規則表達式的定義始終以“/”為參數分割符,不受
URL_PATHINFO_DEPR
設置的影響
每個參數中以“:”開頭的參數都表示動態參數,並且會自動對應一個GET參數,例如:id
表示該處匹配到的參數可以使用$_GET['id']
方式獲取,:year
、 :month
、:day
則分別對應$_GET['year']
、 $_GET['month']
和 $_GET['day']
。
數字約束
支持對變量的類型檢測,但僅僅支持數字類型的約束定義,例如
'blog/:id\d'=>'Blog/read',
表示只會匹配數字參數,如果你需要更加多的變量類型檢測,請使用正則表達式定義來解決。
目前不支持長度約束,需要的話采用正則定義解決
函數支持
可以支持對路由變量的函數過濾,例如:
'blog/:id\d|md5'=>'Blog/read',
表示對匹配到的id變量進行md5處理,也就是說,實際傳入read操作方法的$_GET['id']
其實是 md5($_GET['id'])
。
注意:不支持對變量使用多次函數處理和函數額外參數傳入。
可選定義
支持對路由參數的可選定義,例如:
'blog/:year\d/[:month\d]'=>'Blog/archive',
[:month\d]
變量用[ ]包含起來后就表示該變量是路由匹配的可選變量。
以上定義路由規則后,下面的URL訪問地址都可以被正確的路由匹配:
http://serverName/index.php/Home/blog/2013
http://serverName/index.php/Home/blog/2013/12
采用可選變量定義后,之前需要定義兩個或者多個路由規則才能處理的情況可以合並為一個路由規則。
可選參數只能放到路由規則的最后,如果在中間使用了可選參數的話,后面的變量都會變成可選參數。
規則排除
非數字變量支持簡單的排除功能,主要是起到避免解析混淆的作用,例如:
'news/:cate^add|edit|delete'=>'News/category'
3.2.2版本開始,為了避免和函數規則沖突,規則路由排除分隔符改為“-”,所以上面的路由定義需要改為: 'news/:cate^add-edit-delete'=>'News/category'
因為規則定義的局限性,恰巧我們的路由規則里面的news和實際的news模塊是相同的命名,而:cate
並不能自動區分當前URL里面的動態參數是實際的操作名還是路由變量,所以為了避免混淆,我們需要對路由變量cate進行一些排除以幫助我們進行更精確的路由匹配,格式^add|edit|delete
表示,匹配除了add edit 和delete之外的所有字符串,我們建議更好的方式還是改進你的路由規則,避免路由規則和模塊同名的情況存在,例如
'new/:cate'=>'News/category'
就可以更簡單的定義路由規則了。
完全匹配
規則匹配檢測的時候只是對URL從頭開始匹配,只要URL地址包含了定義的路由規則就會匹配成功,如果希望完全匹配,可以使用$符號,例如:
'new/:cate$'=> 'News/category'
http://serverName/index.php/Home/new/info
會匹配成功,而
http://serverName/index.php/Home/new/info/2
則不會匹配成功。
如果是采用
'new/:cate'=> 'News/category'
方式定義的話,則兩種方式的URL訪問都可以匹配成功。
完全匹配的路由規則中如果使用可選參數的話將會無效。