域名路由
ThinkPHP支持完整域(yu)名(ming)、子域(yu)名(ming)和IP部署的路由和綁(bang)定功能,同時還可以起到(dao)簡化URL的作(zuo)用。
要啟用域名(ming)部署路由功(gong)能,首先需要開(kai)啟:
'url_domain_deploy' => true
定義域名部署規則支持兩種(zhong)方(fang)式:動(dong)態注(zhu)冊和配置(zhi)定義。
動態注冊
可以在應用(yong)的公共文件或(huo)者配(pei)置文件中動態注冊域(yu)名部署規則,例如:
// blog子域名綁定(ding)到blog模塊
Route::domain('blog','blog');
// 完整域(yu)名(ming)綁定(ding)到admin模塊
Route::domain('admin.thinkphp.cn','admin');
// IP綁定到(dao)admin模塊
Route::domain('114.23.4.5','admin');
blog子域名綁定后,URL訪問(wen)規則變成(cheng):
// 原來(lai)的(de)URL訪問
http://www.thinkphp.cn/blog/article/read/id/5
// 綁定到blog子(zi)域名訪(fang)問
http://blog.thinkphp.cn/article/read/id/5
支持綁(bang)定的時候添加默(mo)認參數,例如:
// blog子域名(ming)綁定到blog模塊
Route::domain('blog','blog?var=thinkphp');
除了綁定到模塊之外,還隱式傳入了一個$_GET['var'] = 'thinkphp' 變量。
支(zhi)持直接綁(bang)定(ding)到控制器,例如(ru):
// blog子域名綁定到index模(mo)塊(kuai)的blog控制(zhi)器(qi)
Route::domain('blog','index/blog');
URL訪問地址(zhi)變(bian)化為:
// 原來的URL訪問
http://www.thinkphp.cn/index/blog/read/id/5
// 綁定到blog子域名訪問
http://blog.thinkphp.cn/read/id/5
如果你的域名后綴比較特殊,例如是com.cn或者net.cn 之類的(de)域名(ming),需要配置:
'url_domain_root'=>'thinkphp.com.cn'
泛域名部署
可以支持泛域(yu)名部署規則,例(li)如(ru):
// 綁定泛二級域名域名到book模塊
Route::domain('*','book?name=*');
下面的URL訪問都會直接訪問book模塊
http://hello.thinkphp.cn
http://quickstart.thinkphp.cn
并且可以(yi)直(zhi)接通過(guo)$_GET['name']變量(liang) 獲取當前(qian)的泛域名。
支持(chi)三級泛域名部署,例如:
// 綁定泛三級域名到user模(mo)塊
Route::domain('*.user','user?name=*');
如(ru)果我們訪(fang)問如(ru)下URL地址:
http://hello.user.thinkphp.cn
的同時,除了會訪問user模塊之外,還會默認傳入 $_GET['name'] = 'hello'
在(zai)配置傳入(ru)參數的時候,如果(guo)需(xu)要使(shi)用當前的泛域(yu)名作為(wei)參數,可(ke)以直接設置為(wei)“*”即可(ke)。
目前(qian)只支持二級域(yu)(yu)名和(he)三級域(yu)(yu)名的(de)泛域(yu)(yu)名部署。
配置定義方式
除了動態注冊之外(wai),還支持(chi)直接在路(lu)由(you)配置文件(jian)中定(ding)義域名部(bu)署規則,例如:
return [
'__domain__'=>[
'blog' => 'blog',
// 泛(fan)域名規則建議在最后定義(yi)
'*.user' => 'user',
'*' => 'book',
],
// 下(xia)面(mian)是路(lu)由規則(ze)定義
]
域名綁定地址
前面(mian)我(wo)們(men)看到的(de)域名部署規則:
// blog子域(yu)名綁定到blog模塊
Route::domain('blog','blog');
其(qi)(qi)實(shi)是把域名綁定到模塊的(de)方式,其(qi)(qi)實(shi)還有其(qi)(qi)他的(de)綁定方式。
綁定到命名空間
// blog子域名綁(bang)定命名空間
Route::domain('blog','\app\blog\controller');
綁定到類
// blog子域名綁(bang)定到類
Route::domain('blog','@\app\blog\controller\Article');
綁定到閉包函數
如(ru)果需(xu)要,你也可(ke)以(yi)直接把域(yu)名綁定(ding)到一個閉包函數,例如(ru):
// blog子域名(ming)綁定(ding)閉包函數
Route::domain('blog',function(){
echo 'hello';
return ['bind'=>'module','module'=>'blog'];
});
域名綁定(ding)到閉(bi)包函數其(qi)(qi)實(shi)是(shi)一種劫持,可以(yi)在閉(bi)包函數里面動態注(zhu)冊其(qi)(qi)它的(de)綁定(ding)機制或者注(zhu)冊新(xin)的(de)路由,例(li)如(ru):
Route::domain('www', function(){
// 動(dong)態注冊域名的路由規(gui)則(ze)
Route::rule('new/:id', 'index/news/read');
Route::rule(':user', 'index/user/info');
});
如果你不(bu)希望繼續,可以直接在閉(bi)包函數里面中止執行。
// blog子域名綁定到閉包函數
Route::domain('blog',function(){
exit('hello');
});
綁定路由規則
可以把域名綁(bang)定到一系(xi)列(lie)指定的(de)路由規則,例如:
Route::domain('blog',[
// 動態注(zhu)冊域名(ming)的路由規則
':id' => ['blog/read',['method'=>'GET'],['id'=>'\d+']],
':name'=>'blog/read',
]);
如果使用配(pei)置(zhi)文件配(pei)置(zhi)的話,可以按照下(xia)面的方式:
return [
'__domain__'=>[
'blog' => [
// 動態(tai)注冊域名的路由規則
':id' => ['blog/read',['method'=>'GET'],['id'=>'\d+']],
':name'=>'blog/read',
],
],
// 下面是其(qi)它(ta)的(de)路由(you)規則定義
]
更詳細的(de)綁定(ding)功(gong)能請參考(kao)路(lu)由綁定(ding)一章內容。
