Yii2基礎版程式多模組二級域名部署方案以及urlManager對二級域名絕對地址的改造方法

阿北發表於2019-02-16

這似乎是個老生常談的問題,那就再談一次吧,本文我們要完成兩件事件。

完成的任務

  • 將模組二級域名化

  • 讓urlManager支援二級域名

將模組二級域名化

我們有這樣的兩個模組,分別是 adminwechat ,接下來想做一件事情

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

相關文章