前言

今天忽然想起给自己的网站弄一个www的子域名。因为网站系统是typecho的,所以还稍稍折腾了一会。

一、如何给Typecho网站设置多域名

如果您的网站没有CDN,可能只需要以下设置就完事了。

方法① 301重定向

说白了就是让你的子域名硬跳转到主站。
首先打开文件(宝塔面板可直接在网站重定向面板上设置)

vi /etc/nginx/sites-enabled/domain.com.conf

然后写入

server {
    listen xxx.xxx.xxx.xxx:xx; //你的IP:端口
    server_name domain.com;  //被重定向域名
    return 301 http://orgindomain.com$request_uri; //向源站重定向(带目录请求)
}

这个方法实在是下策,对seo优化和打开速度都不友好,不是很推荐。

方法② 修改Typecho配置文件

在Typecho网站根目录下 config.inc.php 中 , 找到

Typecho_Db::set($db);

这句话,在其后写上:

Helper::options()->siteUrl='http://www.domain.com';//你的子站点

方法③ 修改Typecho框架文件

在网站根目录下 /var/Widget/Options.php 中,找到

/** 初始化站点信息 */
if (defined('__TYPECHO_SITE_URL__')) {
    $this->siteUrl = __TYPECHO_SITE_URL__;
} else if (defined('__TYPECHO_DYNAMIC_SITE_URL__') && __TYPECHO_DYNAMIC_SITE_URL__) {
    $this->siteUrl = $this->rootUrl;
}

在它的前面加上:

if($_SERVER['SERVER_NAME']=='www.orgindomain.com'){ //判断地址栏域名
    $this->siteUrl = 'http://www.orgindomain.com';  //将站点总体域名替换为地址栏域名
}

以上方法对大多网站都适用。
可是,由于我加了CDN,源站和子站即使是同一个项目,也不会被允许,依旧存在跨域问题。

如何解决跨域问题

这时候有一个非常好的办法。
在做兼容多站点时,我在Typecho的框架 /var/Widget/Options.php 中发现这样一段话:

if (defined('__TYPECHO_SITE_URL__')) {
    $this->siteUrl = __TYPECHO_SITE_URL__;
} else if (defined('__TYPECHO_DYNAMIC_SITE_URL__') && __TYPECHO_DYNAMIC_SITE_URL__) {
    $this->siteUrl = $this->rootUrl;
}

这个 __TYPECHO_DYNAMIC_SITE_URL__ 引起了我的注意。经过测试,我发现:
在Typecho网站根目录下 config.inc.php 中,

/** 用户中心(相对路径) */
define('__TYPECHO_USER_DIR__', '/user/');

后面加上

/**开启动态域名/跨域补救**/
define('__TYPECHO_DYNAMIC_SITE_URL__',true);

即可完美解决网站资源跨域问题!
目前我的个人站:香菜个人站-mdzz.pro
和子站点:https://www.mdzz.pro
都能够完美访问了!