域名路由
ThinkPHP支持完整域名、子域名和IP部署的路由和綁定功能,同時(shí)還可以起到簡化URL的作用。
要啟用域名部署路由功能,首先需要開啟:
'url_domain_deploy' => true
定義域名部署規(guī)則支持兩種方式:動(dòng)態(tài)注冊和配置定義。
動(dòng)態(tài)注冊
可以在應(yīng)用的公共文件或者配置文件中動(dòng)態(tài)注冊域名部署規(guī)則,例如:
// blog子域名綁定到blog模塊
Route::domain('blog','blog');
// 完整域名綁定到admin模塊
Route::domain('admin.thinkphp.cn','admin');
// IP綁定到admin模塊
Route::domain('114.23.4.5','admin');
blog子域名綁定后,URL訪問規(guī)則變成:
// 原來的URL訪問
http://www.thinkphp.cn/blog/article/read/id/5
// 綁定到blog子域名訪問
http://blog.thinkphp.cn/article/read/id/5
支持綁定的時(shí)候添加默認(rèn)參數(shù),例如:
// blog子域名綁定到blog模塊
Route::domain('blog','blog?var=thinkphp');
除了綁定到模塊之外,還隱式傳入了一個(gè)$_GET['var'] = 'thinkphp'
變量。
支持直接綁定到控制器,例如:
// blog子域名綁定到index模塊的blog控制器
Route::domain('blog','index/blog');
URL訪問地址變化為:
// 原來的URL訪問
http://www.thinkphp.cn/index/blog/read/id/5
// 綁定到blog子域名訪問
http://blog.thinkphp.cn/read/id/5
如果你的域名后綴比較特殊,例如是com.cn
或者net.cn
之類的域名,需要配置:
'url_domain_root'=>'thinkphp.com.cn'
泛域名部署
可以支持泛域名部署規(guī)則,例如:
// 綁定泛二級(jí)域名域名到book模塊
Route::domain('*','book?name=*');
下面的URL訪問都會(huì)直接訪問book模塊
http://hello.thinkphp.cn
http://quickstart.thinkphp.cn
并且可以直接通過$_GET['name']變量 獲取當(dāng)前的泛域名。
支持三級(jí)泛域名部署,例如:
// 綁定泛三級(jí)域名到user模塊
Route::domain('*.user','user?name=*');
如果我們訪問如下URL地址:
http://hello.user.thinkphp.cn
的同時(shí),除了會(huì)訪問user模塊之外,還會(huì)默認(rèn)傳入 $_GET['name'] = 'hello'
在配置傳入?yún)?shù)的時(shí)候,如果需要使用當(dāng)前的泛域名作為參數(shù),可以直接設(shè)置為“*”即可。
目前只支持二級(jí)域名和三級(jí)域名的泛域名部署。
配置定義方式
除了動(dòng)態(tài)注冊之外,還支持直接在路由配置文件中定義域名部署規(guī)則,例如:
return [
'__domain__'=>[
'blog' => 'blog',
// 泛域名規(guī)則建議在最后定義
'*.user' => 'user',
'*' => 'book',
],
// 下面是路由規(guī)則定義
]
域名綁定地址
前面我們看到的域名部署規(guī)則:
// blog子域名綁定到blog模塊
Route::domain('blog','blog');
其實(shí)是把域名綁定到模塊的方式,其實(shí)還有其他的綁定方式。
綁定到命名空間
// blog子域名綁定命名空間
Route::domain('blog','\app\blog\controller');
綁定到類
// blog子域名綁定到類
Route::domain('blog','@\app\blog\controller\Article');
綁定到閉包函數(shù)
如果需要,你也可以直接把域名綁定到一個(gè)閉包函數(shù),例如:
// blog子域名綁定閉包函數(shù)
Route::domain('blog',function(){
echo 'hello';
return ['bind'=>'module','module'=>'blog'];
});
域名綁定到閉包函數(shù)其實(shí)是一種劫持,可以在閉包函數(shù)里面動(dòng)態(tài)注冊其它的綁定機(jī)制或者注冊新的路由,例如:
Route::domain('www', function(){
// 動(dòng)態(tài)注冊域名的路由規(guī)則
Route::rule('new/:id', 'index/news/read');
Route::rule(':user', 'index/user/info');
});
如果你不希望繼續(xù),可以直接在閉包函數(shù)里面中止執(zhí)行。
// blog子域名綁定到閉包函數(shù)
Route::domain('blog',function(){
exit('hello');
});
綁定路由規(guī)則
可以把域名綁定到一系列指定的路由規(guī)則,例如:
Route::domain('blog',[
// 動(dòng)態(tài)注冊域名的路由規(guī)則
':id' => ['blog/read',['method'=>'GET'],['id'=>'\d+']],
':name'=>'blog/read',
]);
如果使用配置文件配置的話,可以按照下面的方式:
return [
'__domain__'=>[
'blog' => [
// 動(dòng)態(tài)注冊域名的路由規(guī)則
':id' => ['blog/read',['method'=>'GET'],['id'=>'\d+']],
':name'=>'blog/read',
],
],
// 下面是其它的路由規(guī)則定義
]
更詳細(xì)的綁定功能請參考路由綁定一章內(nèi)容。