這似乎是個老生常談的問題,那就再談一次吧,本文我們要完成兩件事件。
完成的任務
-
將模組二級域名化
-
讓urlManager支援二級域名
將模組二級域名化
我們有這樣的兩個模組,分別是 admin 和 wechat ,接下來想做一件事情
http://wechat.abc.com ===> wechat
http://admin.abc.com ===> admin
廢話少說,開始乾貨~?
解析一個二級域名
我們以 admin 為例,首先要解析 http://admin.abc.com ,在各種雲的域名控制皮膚。
配置 config/web.php
修改 urlManager 配置項
`urlManager` => [
`enablePrettyUrl` => true,
`showScriptName` => false,
`rules` => [
`http://admin.abc.com`=>`admin`,// 方法一 直接指定
`http://<_m:(sys|admin|photo)>.abc.com`=>`<_m>` //方法二 多個二級域名同時適配也可以
],
],
完了麼?
恩,完了,多模組的二級域名部署就可以了,阿北知道你一定認為此文為標題黨,幹嘛寫這麼有深度的標題那????
其實二級域名的部署並不複雜,複雜在部署後所引發的一些列問題,這種問題可能是需求上的,可能是技術上的。
@@nai8@@
接下來就舉一個需求上的例子。
二級域名管理問題
我們推薦使用urlManager來生成連結,而不是人為寫 http://xxx.xxx.xxx/xxx.html 這樣,這樣對以後適配url規則的更改有莫大的好處。
但是當二級域名後,我在 admin 模組下想 生成一個 wechat 模組的連結就變的困難了,相對url肯定是不行了,但是如果我們用yii提供的 createAbsoluteUrl ,它的domain部分也是使用當前域名,無法指定,因此也行不通,看來要改造一下。
原則:不改動yii原始碼。
新建一個 urlManager 類
在不改變urlManager任何方法的前提下,我們需要擴充套件一下它,所以第一步我們在 appcomponents 下建立一個叫做 urlManager 的類,這個類繼承於 yii 的 urlManager 類,並且增加一個叫做 domainName 的屬性。
namespace appcomponents;
use Yii;
use yiihelpersUrl;
use yiiaseInvalidConfigException;
class UrlManager extends yiiwebUrlManager
{
public $domainName;
protected $_hostInfo;
public function getProperDomain(){
if ( ! isset($this->domainName) || empty($this->domainName) ) {
throw new InvalidConfigException(`Request requires a domain name to be configured!`);
}
return $this->domainName;
}
public function getHostInfo(){
if ($this->_hostInfo === null)
{
$secure = Yii::$app->getRequest()->getIsSecureConnection();
$http = $secure ? `https` : `http`;
if (isset($_SERVER[`HTTP_HOST`])) {
$this->_hostInfo = $http . `://` . $this->getProperDomain();
} elseif (isset($_SERVER[`SERVER_NAME`])) {
$this->_hostInfo = $http . `://` . $this->getProperDomain();
$port = $secure ? $this->getSecurePort() : $this->getPort();
if (($port !== 80 && !$secure) || ($port !== 443 && $secure)) {
$this->_hostInfo .= `:` . $port;
}
}
}
return $this->_hostInfo;
}
}
思路其實很簡單,就是我們重寫了 getHostInfo 函式,將指定的 domainName 加上去。
配置config/web.php
我們在web.php的 components 中自定義一個叫做 adminUrlManager的項。
...
`urlManager` => [
`enablePrettyUrl` => true,
`showScriptName` => false,
`rules` => [
`http://<_m:(sys|admin|photo)>.zhihu-local.com`=>`<_m>`,
],
],
`adminUrlManager`=>[
`class` => `appcomponentsUrlManager`,
`domainName` => `admin.abc.com`,
]
...
好了,此刻我們在任何一個模組或app下執行下面程式碼
echo Yii::$app->adminUrlManager->createAbsoluteUrl([`default/index`]);
都會輸出我們想要的絕對地址。
http://admin.abc.com/index.ph…
目的達到了吧。
再說幾句
今天是端午小長假第二天,因陪家人來龍潭大峽谷玩,晚上旅店的網路不好,剛剛編輯好發出來,實在不好意思,在這裡我和北嫂也一起祝大家節日快樂,多陪陪家人,他們才是最重要的。
歡迎來到我的小站 更多yii2視訊 http://nai8.me