ThinkPHP中泛域名部署的實(shí)現(xiàn)方法
如何在ThinkPHP中實(shí)現(xiàn)泛域名部署站群
對(duì)于需要部署多個(gè)網(wǎng)站的開發(fā)者來說,站群架構(gòu)是一種廣泛采用的設(shè)計(jì)模式。而泛域名部署則是站群架構(gòu)中比較常見的實(shí)現(xiàn)方式之一。在這篇文章中,我們將介紹如何在ThinkPHP框架中實(shí)現(xiàn)泛域名部署站群。
一、什么是泛域名部署?
泛域名部署是將一個(gè)域名下的所有子域名指向同一個(gè)文件夾或不同的文件夾。這樣,只需要一個(gè)主域名即可實(shí)現(xiàn)多個(gè)網(wǎng)站的部署,大大簡(jiǎn)化了網(wǎng)站的管理和維護(hù)。
例如,我們有一個(gè)主域名為example.com,現(xiàn)在需要部署三個(gè)子域名:site1.example.com、site2.example.com和site3.example.com。若使用傳統(tǒng)的部署方式,需要為每個(gè)子域名單獨(dú)配置一個(gè)虛擬主機(jī),并安裝不同的網(wǎng)站應(yīng)用程序。而使用泛域名部署,則只需要將所有子域名指向同一個(gè)文件夾即可,每個(gè)子域名內(nèi)的網(wǎng)站應(yīng)用程序可以共享同一套代碼和數(shù)據(jù)。
二、泛域名部署的實(shí)現(xiàn)方法
配置DNS
首先,需要在DNS管理界面添加泛解析記錄。在DNS解析列表中添加一條記錄,主機(jī)記錄填寫“*”,記錄類型填寫“A”,記錄值填寫網(wǎng)站服務(wù)器的IP地址。
如圖所示,這個(gè)泛解析設(shè)置將所有子域名都指向了1.2.3.4這個(gè)IP地址。
服務(wù)器配置
在nginx或apache中,需要將所有子域名指向同一個(gè)文件夾或不同的文件夾。以nginx為例,打開nginx配置文件,添加以下代碼:
server { listen 80; server_name .example.com; root /var/www/example/; //根路徑 index index.php index.html index.htm; location / { if ($request_uri ~* "\/(.*)\/(.*)\/(.*)") { set $subdomain $1; //獲取子域名 } if ($subdomain) { //轉(zhuǎn)發(fā)到指定子域名的文件夾 rewrite ^(.*)$ /$subdomain$1 last; } //沒有寫子域名,則轉(zhuǎn)發(fā)到根路徑 if (!$subdomain) { rewrite ^(.*)$ /index.php last; } } }
以上配置將所有請(qǐng)求按照子域名進(jìn)行重寫,使得訪問“site1.example.com”的請(qǐng)求實(shí)際上是訪問 “/site1/” 文件夾下的內(nèi)容。
ThinkPHP配置
在ThinkPHP中,需要在config目錄下的route.php文件中添加路由解析規(guī)則。例如,在我們網(wǎng)站中有一個(gè)名為Blog的控制器,那么我們可以這樣設(shè)置路由解析規(guī)則:
use think\Route; Route::domain(‘site1', ‘blog'); //訪問site1.example.com時(shí)轉(zhuǎn)發(fā)到Blog控制器 Route::domain(‘site2', ‘blog'); //訪問site2.example.com時(shí)轉(zhuǎn)發(fā)到Blog控制器 Route::domain(‘site3', ‘blog'); //訪問site3.example.com時(shí)轉(zhuǎn)發(fā)到Blog控制器
考慮到這里我們『泛域名部署站群』的本意,我們可以使用正則表達(dá)式來替換上面的代碼:
use think\Route; Route::pattern([ 'subdomain' => '\w+', ]); Route::domain(‘:subdomain.example.com', function ($subdomain) { Route::group($subdomain, function () { Route::get('/', 'Index/index'); Route::get('/test', 'Index/test'); }); });
以上代碼使用了一個(gè)正則表達(dá)式“\w+”來匹配所有域名子串,然后路由到同一個(gè)控制器。這樣,我們就可以在控制器中根據(jù)不同的子域名展現(xiàn)不同的頁面。
拓展:Thinkphp 部署/域名部署
域名部署
ThinkPHP支持模塊(甚至可以包含控制器)的完整域名、子域名和IP部署功能
開啟域名部署
無論是子域名還是IP部署,首先要在應(yīng)用配置文件中開啟APP_SUB_DOMAIN_DEPLOY
,這是前提,然后配置域名部署規(guī)則APP_SUB_DOMAIN_RULES
。
'APP_SUB_DOMAIN_DEPLOY' => 1, // 開啟子域名或者IP配置 'APP_SUB_DOMAIN_RULES' => array( /* 域名部署配置 *格式1: '子域名或泛域名或IP'=> '模塊名[/控制器名]'; *格式2: '子域名或泛域名或IP'=> array('模塊名[/控制器名]','var1=a&var2=b&var3=*'); */ )
域名或者IP部署到模塊并不需要設(shè)置模塊訪問列表。
完整域名部署
可以在域名規(guī)則中直接定義完整的域名,例如:
'APP_SUB_DOMAIN_DEPLOY' => 1, // 開啟子域名配置 'APP_SUB_DOMAIN_RULES' => array( 'admin.domain1.com' => 'Admin', // admin.domain1.com域名指向Admin模塊 'test.domain2.com' => 'Test', // test.domain2.com域名指向Test模塊 ),
在域名部署之前的訪問地址: http://www.domain.com/Admin/Index/index
和 http://www.domain.com/Test/Index/index
域名部署后的訪問地址變成: http://admin.domain1.com/Index/index
和 http://test.domain2.com/Index/index
子域名部署
子域名部署包括任意級(jí)子域名的支持,在你的應(yīng)用配置文件中增加如下配置參數(shù):
'APP_SUB_DOMAIN_DEPLOY' => 1, // 開啟子域名配置 'APP_SUB_DOMAIN_RULES' => array( 'admin' => 'Admin', // admin子域名指向Admin模塊 'test' => 'Test', // test子域名指向Test模塊 ),
部署之前的訪問地址:http://www.domain.com/Admin/Index/index
部署后的訪問地址變成: http://admin.domain.com/Index/index
如果你的部署域名后綴是二級(jí)后綴,例如 com.cn
、net.cn
或者 org.cn
之類的話,為了讓系統(tǒng)更好的識(shí)別你的子域名,需要配置APP_DOMAIN_SUFFIX
如下:
'APP_DOMAIN_SUFFIX'=>'com.cn'
APP_DOMAIN_SUFFIX參數(shù)不支持設(shè)置多個(gè)后綴,如果你是一級(jí)域名后綴的話則該參數(shù)可以無需任何設(shè)置。
傳入?yún)?shù)
子域名部署的時(shí)候,可以傳入隱式的參數(shù),例如:
'APP_SUB_DOMAIN_DEPLOY' => 1, // 開啟子域名配置 'APP_SUB_DOMAIN_RULES' => array( 'admin' => array('Admin','var1=1&var2=2'), // admin子域名指向Admin模塊 ),
訪問 http://admin.domain.com/Index/index
的同時(shí)會(huì)傳入 $_GET['var1'] = 1
和 $_GET['var2'] = 2
兩個(gè)參數(shù)。
控制器綁定
子域名部署還可以支持綁定某個(gè)控制器,例如:
'APP_SUB_DOMAIN_DEPLOY' => 1, // 開啟子域名配置 'APP_SUB_DOMAIN_RULES' => array( 'test.admin' => 'Admin/Test', // test.admin子域名指向Admin模塊的Test控制器 ),
部署之前的訪問地址: http://www.domain.com/Admin/Test/index
部署后的訪問地址: http://test.admin.domain.com/index
如果要部署某個(gè)模塊到泛域名支持,可以使用:
'APP_SUB_DOMAIN_DEPLOY' => 1, // 開啟子域名配置 'APP_SUB_DOMAIN_RULES' => array( 'admin' => 'Admin', // admin域名指向Admin模塊 '*' => array('Test','var1=1&var2=*'), // 二級(jí)泛域名指向Test模塊 '*.user' => array('User','status=1&name=*'), // 三級(jí)泛域名指向User模塊 ),
泛域名部署
如果要部署某個(gè)模塊到泛域名支持,可以使用:
'APP_SUB_DOMAIN_DEPLOY' => 1, // 開啟子域名配置 'APP_SUB_DOMAIN_RULES' => array( 'admin' => 'Admin', // admin域名指向Admin模塊 '*' => array('Test','var1=1&var2=*'), // 二級(jí)泛域名指向Test模塊 '*.user' => array('User','status=1&name=*'), // 三級(jí)泛域名指向User模塊 ),
配置后,我們可以訪問:
http://hello.domain.com/Index/index
訪問Test模塊 并隱式傳入$_GET['var1'] = 1
和 $_GET['var2'] = 'hello'
兩個(gè)參數(shù)。
訪問如下地址:
訪問如下地址:
http://think.user.domain.com/Index/index
訪問User模塊,并隱式傳入 $_GET['status'] = 1
和 $_GET['name'] = 'think'
兩個(gè)參數(shù)。
在配置傳入?yún)?shù)的時(shí)候,如果需要使用當(dāng)前的泛域名作為參數(shù),可以直接設(shè)置為“*”
即可。
目前只支持二級(jí)域名和三級(jí)域名的泛域名部署。
IP訪問部署
可以為某些模塊配置IP訪問規(guī)則,例如:
'APP_SUB_DOMAIN_DEPLOY' => 1, // 開啟子域名配置 'APP_SUB_DOMAIN_RULES' => array( '22.56.78.9' => 'Admin', // 22.56.78.9指向Admin模塊 ),
總結(jié)
本文介紹了如何在ThinkPHP框架中實(shí)現(xiàn)泛域名部署站群,具體步驟涉及DNS、服務(wù)器和ThinkPHP的配置。通過此種方式,可以輕松管理和維護(hù)多個(gè)網(wǎng)站,同時(shí)也可以實(shí)現(xiàn)多樣化的功能擴(kuò)展。希望本文能夠幫助到有需要的朋友。
以上就是ThinkPHP中泛域名部署的實(shí)現(xiàn)方法的詳細(xì)內(nèi)容,更多關(guān)于ThinkPHP泛域名部署的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
php制作動(dòng)態(tài)隨機(jī)驗(yàn)證碼
這篇文章主要介紹了php制作動(dòng)態(tài)隨機(jī)驗(yàn)證碼的方法的相關(guān)資料,需要的朋友可以參考下2015-02-02Win7環(huán)境下Apache連接MySQL提示連接已重置的解決辦法
這篇文章主要為大家詳細(xì)介紹了Win7環(huán)境下Apache連接MySQL提示“連接已重置”的解決辦法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05針對(duì)thinkPHP5框架存儲(chǔ)過程bug重寫的存儲(chǔ)過程擴(kuò)展類完整實(shí)例
這篇文章主要介紹了針對(duì)thinkPHP5框架存儲(chǔ)過程bug重寫的存儲(chǔ)過程擴(kuò)展類,結(jié)合完整實(shí)例形式給出了修復(fù)thinkPHP5存儲(chǔ)過程原有bug的擴(kuò)展類定義與使用方法,需要的朋友可以參考下2018-06-06PHP兩個(gè)n位的二進(jìn)制整數(shù)相加問題的解決
這篇文章主要為大家詳細(xì)介紹了PHP兩個(gè)n位的二進(jìn)制整數(shù)相加問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08淺談PHP中靜態(tài)方法和非靜態(tài)方法的相互調(diào)用
下面小編就為大家?guī)硪黄獪\談PHP中靜態(tài)方法和非靜態(tài)方法的相互調(diào)用。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10