## 概述
在ThinkPHP5中,可以很輕松的實(shí)現(xiàn)將模塊部署到某個(gè)域名規(guī)則(包括完整域名、二級(jí)域名、三級(jí)域名和泛域名),而不需要分開不同的應(yīng)用入口文件。
要使用域名部署,首先需要在應(yīng)用的公共配置文件中開啟
~~~
'url_domain_deploy'=>true,
~~~
## 域名部署
開啟域名部署后,可以在應(yīng)用配置文件中設(shè)置`url_domain_rules`或者通過下面的方法動(dòng)態(tài)設(shè)置。
### 注冊(cè)域名部署規(guī)則
可以用Route類的domain方法注冊(cè)子域名部署規(guī)則:
~~~
\think\Route::domain('域名規(guī)則','部署規(guī)則');
~~~
或者批量注冊(cè):
~~~
\think\Route::domain(['域名規(guī)則'=>'部署規(guī)則',...]);
~~~
### 域名規(guī)則
域名規(guī)則的定義可以支持完整域名(或者IP)、二級(jí)域名(包括泛二級(jí)域名)和三級(jí)域名(包括泛三級(jí)域名),例如:
~~~
\think\Route::domain('doc.thinkphp.cn','home/doc'); // 部署完整域名doc.thinkphp.cn到應(yīng)用的home模塊的doc控制器
\think\Route::domain('202.65.34.5','admin'); // IP地址202.65.34.5訪問部署到admin模塊
\think\Route::domain('blog','home/blog'); // 部署blog二級(jí)域名到home模塊的blog控制器
\think\Route::domain('*','home'); // 泛二級(jí)域名部署到home模塊
\think\Route::domain('admin.blog','admin'); // 三級(jí)域名部署到admin模塊
\think\Route::domain('*.user','user'); // 泛三級(jí)域名部署到user模塊
~~~
或者采用批量注冊(cè)方式定義:
~~~
\think\Route::domain([
'doc.thinkphp.cn' => 'home/doc',
'202.65.34.5' => 'admin',
'blog' => 'home/blog',
'*' => 'home',
'admin.blog' => 'admin',
'*.user' => 'user'
]);
~~~
注意域名部署的優(yōu)先判斷級(jí)別,依次是:
#### 完整域名(或IP)-> 二級(jí)域名(或者三級(jí)域名)-> 泛三級(jí)域名 -> 泛二級(jí)域名
## 部署規(guī)則
域名的部署規(guī)則其實(shí)就是把基于部署域名的URL訪問綁定到相關(guān)地址,支持下面幾種類型,包括:
* 綁定到模塊/控制器/操作;
* 綁定到命名空間;
* 綁定到類;
* 綁定到路由分組;
* 綁定閉包方法;
> 需要注意的是,除了了模塊綁定之外的類型,將不會(huì)再進(jìn)行路由檢測(cè)。
### 模塊綁定
也就是把域名綁定到指定的模塊、控制器,甚至是操作的方式,并且還可以支持傳入額外的參數(shù),例如:
~~~
\think\Route::domain('blog','home/blog?status=1&type=1'); // 部署blog二級(jí)域名到home/blog,并傳入status和type參數(shù)
~~~
上面的定義會(huì)把`$_GET['status'] = 1` 和 `$_GET['type'] = 1` 隱式傳入當(dāng)前的訪問。
如果使用的是泛域名規(guī)則的話,可以獲取泛域名的內(nèi)容作為參數(shù)帶入,例如:
~~~
\think\Route::domain('*.user','user?status=1&username=*'); // 泛三級(jí)域名部署到User模塊
~~~
上面的定義,表示部署泛三級(jí)域名*.user到user模塊,并傳入 `$_GET['status'] = 1` 和 $_GET['username'] = '當(dāng)前實(shí)際的泛域名'。
如果成功匹配到某個(gè)域名部署規(guī)則的話,URL地址中的解析規(guī)則將會(huì)發(fā)生變化,例如,采用域名部署之前的URL地址是:
~~~
http://www.domain.com/admin/blog/add
~~~
如果定義了
~~~
\think\Route::domain('admin','admin');
~~~
那么訪問的URL地址就變成了:
~~~
http://admin.domain.com/blog/add
~~~
### 綁定到命名空間
可以支持綁定到命名空間,例如:
~~~
\think\Route::domain('admin','\app\admin\api');
~~~
把a(bǔ)dmin子域名的訪問綁定到`\app\admin\api`命名空間下面,如果請(qǐng)求URL地址是:
~~~
http://admin.domain.com/index.php/user/info/id/8
~~~
那么執(zhí)行的其實(shí)就是 \app\admin\api\user 類的info方法,并且傳入?yún)?shù)id=8
### 綁定到類
支持直接綁定到類,例如:
~~~
\think\Route::domain('admin','@\app\admin\api\user');
~~~
把a(bǔ)dmin子域名的訪問綁定到`\app\admin\api\user`類下面,如果請(qǐng)求URL地址是:
~~~
http://admin.domain.com/index.php/info/id/8
~~~
那么執(zhí)行的其實(shí)就是和上面相同的方法。
### 綁定到路由分組
如果你定義了較多的分組路由,也可以支持把域名綁定到某個(gè)路由分組,例如:
~~~
\think\Route::domain('admin','[admin]');
~~~
綁定之后,檢測(cè)路由的時(shí)候只會(huì)檢測(cè)該分組下面的路由。
### 閉包支持
域名的部署規(guī)則支持閉包函數(shù),例如:
~~~
\think\Route::domain('*',function(){
exit('非法訪問!');
});
~~~
部署規(guī)則中的閉包函數(shù)不支持外部傳入?yún)?shù),但可以支持默認(rèn)參數(shù)。
如果要進(jìn)行路由劫持,可以在閉包函數(shù)里面返回?cái)?shù)組,例如:
~~~
\think\Route::domain('user',function(){
// 表示路由到user模塊的index控制器
return ['type'=>'module','module'=>'user/index'];
});
~~~
## 配置文件
也可以直接在應(yīng)用配置文件中直接設(shè)置如下:
~~~
'url_domain_deploy'=>true,
~~~
在route.php文件中添加域名部署定義如下:
~~~
return [
'__domain__'=>[
'doc.thinkphp.cn' => 'home/doc',
'202.65.34.5' => 'admin',
'blog' => 'home/blog',
'*' => 'home',
'admin.blog' => 'admin',
'*.user' => 'user'
]
];
~~~
- 介紹
- 快速入門
- 安裝配置
- 目錄結(jié)構(gòu)
- 系統(tǒng)架構(gòu)
- 命名規(guī)范
- 自動(dòng)生成
- 引導(dǎo)文件
- 自動(dòng)加載
- 配置
- 路由
- 控制器
- 模型
- 視圖
- 模板
- 自定義標(biāo)簽庫(kù)
- 數(shù)據(jù)庫(kù)
- 域名部署
- 輸入
- 緩存
- 日志
- 行為
- 多語(yǔ)言
- 調(diào)試
- 新特性介紹
- 增強(qiáng)路由功能
- 更靈活的控制器
- API開發(fā)支持
- 內(nèi)置SocketLog
- 新的自動(dòng)生成
- 利用Traits特性擴(kuò)展
- 自動(dòng)加載及Loader類
- 命令行工具集
- 附錄
- 升級(jí)指南
- 配置參考
- 錯(cuò)誤編碼
