本文约 2,850 字,预计阅读 8 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:子域名还是子目录,这是个架构问题
两种模式的取舍:
| 维度 | 子目录(/shanghai) | 子域名(shanghai.mimangfei.com) |
|---|---|---|
| SEO 权重 | 继承主域,集中 | 相对分散,但独立性强 |
| DNS / SSL | 无需额外配置 | 需要泛解析 + 通配符证书 |
| 视觉独立感 | 弱 | 强 |
| 配置难度 | 低 | 中 |
如果你的子站是独立品牌或独立业务,子域名更合适;如果是同一品牌的城市分站或栏目,子目录对搜索更友好。
原理分析:子域名模式多了什么
技术上,区别只有一个常量:
define('SUBDOMAIN_INSTALL', true); // 子域名
define('SUBDOMAIN_INSTALL', false); // 子目录
但基础设施层面多了两件事:
- DNS 泛解析:
*.mimangfei.com必须都解析到服务器 IP,否则新子站建了也访问不了; - Web 服务器泛域名:Nginx 的
server_name要接受任意子域名,Apache 用ServerAlias。
SSL 也要跟上:要么申请通配符证书 *.mimangfei.com,要么每个子站单独申请。
保姆级实操
第一步:DNS 添加通配符记录
在域名服务商处添加:
类型:A
主机记录:*
记录值:服务器公网 IP
TTL:600
验证:
nslookup random-test.mimangfei.com
应返回你的服务器 IP。注意:部分域名服务商(尤其国内)对泛解析有额外要求或不支持,需提前确认。
第二步:修改 wp-config.php
define('WP_ALLOW_MULTISITE', true);
后台 → 工具 → 配置网络 → 选择”子域名” → 安装,然后按提示写入:
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', true);
define('DOMAIN_CURRENT_SITE', 'mimangfei.com');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
define('COOKIE_DOMAIN', '.mimangfei.com'); // 关键:带前导点
COOKIE_DOMAIN 设成 .mimangfei.com(注意前面的点),这样登录 Cookie 在所有子域名之间共享,否则切换子站要反复登录。
第三步:Nginx 泛域名配置
server {
listen 80;
server_name mimangfei.com *.mimangfei.com;
root /var/www/mimangfei.com;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
}
关键是 server_name 里的 *.mimangfei.com。Nginx 支持前缀通配符(不支持 mimangfei.* 这种后缀通配)。
如果用 Apache:
<VirtualHost *:80>
ServerName mimangfei.com
ServerAlias *.mimangfei.com
DocumentRoot /var/www/mimangfei.com
</VirtualHost>
第四步:SSL 通配符证书
Let’s Encrypt 的通配符证书只能用 DNS-01 验证,不能用 HTTP-01:
certbot certonly \
--manual \
--preferred-challenges=dns \
-d mimangfei.com -d '*.mimangfei.com' \
--server https://acme-v02.api.letsencrypt.org/directory
certbot 会要求你添加一条 _acme-challenge.mimangfei.com 的 TXT 记录。添加后等待生效再回车。
注意:手动方式的证书不会自动续期(需要再次手工加 TXT)。长期方案是用支持 DNS API 的插件(如 certbot-dns-aliyun、certbot-dns-cloudflare)。
第五步:创建子站并验证
网络管理 → 站点 → 添加新站点,地址填 shanghai,访问 https://shanghai.mimangfei.com/。
第六步:强制主域名(可选)
if ($host = 'mimangfei.com') {
return 301 https://www.mimangfei.com$request_uri;
}
常见踩坑与失败案例
- 子站创建成功但打不开 —— DNS 泛解析未生效(等 TTL)或 Nginx 没配
*.。先ping 随机子域名确认解析,再确认 server_name。 - 切换子站反复要登录 ——
COOKIE_DOMAIN没设或没带前导点。 - 案例:某站启用子域名多站点后,Let’s Encrypt 通配符证书三个月到期,手动续期时忘了加 TXT 记录,全站(含所有子站)断 HTTPS。教训是通配符证书一定要配自动续期,否则到期就是全网事故。
- 主站已运行超过一个月 —— WordPress 官方对子域名安装有一条提示:站点创建超过一个月后,子域名模式会有兼容性警告(主要影响已有内容的 URL 冲突)。老站建议先评估。
- CDN 不识别泛域名 —— Cloudflare 等 CDN 默认只代理已添加的域名,需要在 CDN 侧也开通泛域名支持并配证书。
- 邮件与子域名的 SPF/DKIM —— 子域名发信需要在 DNS 补充对应记录,否则邮件进垃圾箱。
总结
子域名多站点相对子目录只多了”DNS 泛解析 + 泛域名 Web 配置 + 通配符证书”三件事,但证书续期是最大的运维风险点,务必配成自动。选型上,我的经验是:同一品牌下的分站用子目录(权重集中、配置简单),独立品牌或多语言站用子域名(独立性、便于按地区部署)。无论哪种,都请先在一台机器上把”创建子站 → 访问 → 备份 → 恢复”跑通再上生产。
