Typecho-多域名访问配置笔记

Typecho 多域名访问配置笔记

问题

Typecho 后台只能设置一个站点 URL,换域名访问时 CSS/JS 及页面链接全部指向原域名。


解决方案

1. config.inc.php 动态覆盖站点 URL

require_once 之前加一行 define,让 Typecho 初始化时使用当前访问的域名:

// 动态站点 URL,支持多域名访问
define('__TYPECHO_SITE_URL__',
    (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http')
    . '://' . $_SERVER['HTTP_HOST']
);
// register autoload
require_once __TYPECHO_ROOT_DIR__ . '/var/Typecho/Common.php';
// init
\Typecho\Common::init();
必须在 \Typecho\Common::init() 之前定义,否则不生效。

2. Caddyfile 多域名并列

blog.example.com, blog1.example.com {
    root * /home/www/blog
    encode gzip
    php_fastcgi unix//run/php-fpm82.sock
    @notFound {
        not file {path} {path}/
    }
    rewrite @notFound /index.php?{query}
    file_server
}

多个域名逗号分隔写在同一块,Caddy 自动申请各域名的 TLS 证书。


效果

用任意绑定的域名访问,CSS/JS 正常加载,页面内所有链接跟随当前域名,无需修改数据库。

这是因为后台"基本设置"里的站点 URL 字段被动态值覆盖后变成只读/不可改了。

不影响使用,但如果想保留后台可编辑,可以换个思路——只在前台覆盖,后台不覆盖

// 动态站点 URL,仅前台生效,后台保留原设置
if (!defined('__TYPECHO_ADMIN_DIR__') || 
    strpos($_SERVER['REQUEST_URI'], '/admin/') === false) {
    define('__TYPECHO_SITE_URL__',
        (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http')
        . '://' . $_SERVER['HTTP_HOST']
    );
}

不过更简单的判断是直接检查路径:

// 后台不覆盖
if (strpos($_SERVER['REQUEST_URI'], '/admin/') === false) {
    define('__TYPECHO_SITE_URL__',
        (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http')
        . '://' . $_SERVER['HTTP_HOST']
    );
}

这样访问 /admin/ 路径时不定义这个常量,Typecho 回退到数据库里的值,后台设置页面恢复正常。前台所有域名访问依然动态跟随。

添加新评论