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 回退到数据库里的值,后台设置页面恢复正常。前台所有域名访问依然动态跟随。