Typecho 多站点部署如何配置子域名指向不同目录

文章导读
Typecho 实现多站点部署时,子域名指向不同目录的核心方案是通过修改 config.inc.php 动态判断域名并分配独立数据库表前缀,而非物理复制多份源码。此方法适用于共享同一份 Typecho 程序但需要数据隔离的多博客场景,风险在于配置错误可能导致数据库表混写。
📋 目录
  1. 快速处理思路
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Typecho 实现多站点部署时,子域名指向不同目录的核心方案是通过修改 config.inc.php 动态判断域名并分配独立数据库表前缀,而非物理复制多份源码。此方法适用于共享同一份 Typecho 程序但需要数据隔离的多博客场景,风险在于配置错误可能导致数据库表混写。

先说结论:Typecho 原生不支持多站点,需通过 PHP 层动态配置实现子域名与数据库表前缀的绑定映射。

  • 适合:同一服务器部署多个 Typecho 博客且希望共用源码便于统一升级维护
  • 先准备:确保 Apache 或 Nginx 已启用伪静态模块,各子域名 DNS 解析指向同一服务器 IP
  • 验收:访问不同子域名时加载独立主题插件,数据库表前缀互不干扰

快速处理思路

Typecho 多站点部署不依赖 Web 服务器目录分发,而是通过 PHP 代码在 config.inc.php 中根据$_SERVER['HTTP_HOST']动态加载不同数据库配置。操作前备份原 config.inc.php,修改后清除浏览器缓存并访问各子域名验证主题与插件是否独立加载。

为什么会这样

Typecho 安装时生成的 config.inc.php 是静态文件,包含固定的数据库连接信息和表前缀,无法自动识别访问域名。直接复制多份源码到不同目录会导致升级维护成本极高,修改一个站点的插件或主题无法同步到其他站点。通过$_SERVER['HTTP_HOST']判断当前访问域名,在 config.inc.php 中动态实例化 Typecho_Db 并分配不同表前缀,可实现一份源码服务多个站点且数据物理隔离。

分步处理

步骤一:准备目录结构

将 Typecho 源码统一放在一个目录,例如/www/wwwroot/typecho/。为每个子域名创建空目录,如/www/wwwroot/blog-a/和/www/wwwroot/blog-b/,每个空目录中放置一个 index.php 文件,内容仅一行:<?php include'../typecho/index.php';?>。此设计确保所有子域名请求最终由同一份 Typecho 核心处理。

步骤二:修改 config.inc.php

删除原 config.inc.php,新建文件并写入域名判断逻辑。代码结构为:先获取$_SERVER['HTTP_HOST'],然后用 if-elseif 判断域名,为每个域名实例化 Typecho_Db 时传入不同表前缀参数,最后调用$db->addServer() 配置数据库连接信息。注意数据库用户名、密码、库名需提前在 MySQL 中创建好。

Typecho 多站点部署如何配置子域名指向不同目录

步骤三:配置 Web 服务器

Apache 环境需确认 mod_rewrite 模块已启用,在 phpEnv 控制面板的 Apache→Modules 中勾选 rewrite_module。Nginx 环境需为每个子域名配置 server 块,server_name 填写对应子域名,root 指向各自的空目录。伪静态规则需保留 Typecho 默认的 pathinfo 支持。

步骤四:安装各站点

依次访问每个子域名完成 Typecho 安装流程,安装时确保数据库表前缀与 config.inc.php 中配置的对应一致。安装完成后不要覆盖 config.inc.php,否则动态判断逻辑会丢失。建议安装前先注释掉 exit('Unknown host')行,安装完成后再恢复。

怎么验证是否生效

访问 blog-a.example.com 和 blog-b.example.com,分别登录后台查看站点设置中的域名是否显示正确。在两个站点分别启用不同主题和插件,确认切换互不影响。检查数据库,确认 typecho_contents、typecho_posts 等表是否按前缀分离,如 a_contents 与 b_contents。尝试访问未配置的子域名,应返回 Unknown host 或 404 错误而非加载默认站点。

常见坑

配置$_SERVER['HTTP_HOST']时遗漏 www 前缀变体,导致带 www 的子域名无法识别。多个站点共享同一数据库时表前缀写错会导致数据混写,例如都用了 typecho_前缀。Typecho 后台只能绑定一个域名,其他域名访问时静态资源路径可能出错,需在 config.inc.php 末尾添加 define('__TYPECHO_DYNAMIC_SITE_URL__',true) 开启动态域名跨域补救。模板中引用资源时避免硬编码 options->siteUrl,改用动态获取方式兼容多域名。

常见问题

子域名访问后插件不生效怎么办

在 config.inc.php 数据库初始化之后添加 define('__TYPECHO_DYNAMIC_SITE_URL__',true) 开启动态域名支持,然后清除浏览器缓存重新访问。

Typecho 多站点部署如何配置子域名指向不同目录

能否用不同数据库而非不同表前缀

可以,在$db->addServer() 的数组参数中修改 database 字段为不同数据库名,但需确保 MySQL 用户有对应库的访问权限。

升级 Typecho 核心会影响所有站点吗

会,因为所有站点共用同一份源码,升级/www/wwwroot/typecho/目录后所有子域名站点同步更新,这是该方案的优势而非缺陷。

Nginx 环境需要额外配置吗

需要为每个子域名单独配置 server 块,server_name 填写对应子域名,root 指向各自的空目录,location 块中保留 Typecho 伪静态规则。

参考来源

1. Typecho 用一个程序建多个网站,通过$_SERVER['HTTP_HOST']动态配置数据库表前缀实现多站点

2. phpEnv 环境下部署 Typecho 博客多项目配置,说明 config.inc.php 动态加载配置的核心逻辑

3. typecho 开启动态域名跨域补救,提供 define('__TYPECHO_DYNAMIC_SITE_URL__',true) 解决方案

4. 模板层面 typecho 兼容多个域名地址,说明静态资源路径在多域名下的处理方法