建站技术
字+
◆◆
  • 小
  • 中
  • 大

多域名绑定同一个PbootCMS站点时,如何为每个子域名单独申请并自动续期Let’s Encrypt证书?

2026-04-28    作者:网际迅联    来源:

2025–2026年真实部署案例),结合 PbootCMS 的技术本质(无域名硬编码、纯静态路由 + PHP 协议自适应),我们为您提供一套 「生产环境已验证、零修改 CMS、支持无限子域名、自动续期不冲突」的 Let’s Encrypt 多域名 HTTPS 解决方案。

✅ 核心结论先行(请务必先理解):
PbootCMS 本身完全不需要任何配置即可支持多域名/子域名共用同一套程序。它通过 $_SERVER['HTTP_HOST'] 动态识别当前访问域名,并自动输出对应协议(HTTP/HTTPS)和链接。因此,您只需为每个域名/子域名 单独申请并管理 Let’s Encrypt 证书,Web 服务器(Nginx/Apache)正确加载即可——PbootCMS 100% 无感、零适配成本。


? 一、适用场景与架构图(清晰定位)

场景 示例域名 是否需要独立证书? 说明
✅ 主站 + 子域名分发(推荐) example.com(主站)
www.example.com(PC入口)
m.example.com(手机站)
en.example.com(英文站)
✅ 是 —— 每个子域名需独立证书 • 主站与子域名共用同一套 PbootCMS 程序+数据库
• 后台无需切换,所有内容统一管理
• Nginx 分别为每个 server{} 块配置 SSL
✅ 多语言子目录变体(不推荐此方式) example.com/zh/, example.com/en/ ❌ 否 —— 只需主域名一个证书 • 仍属同一域名,HTTPS 由主证书覆盖
• 更简单、更安全(避免证书管理爆炸)
⚠️ 完全独立品牌站(慎用) brand1.com, brand2.com, brand3.com ✅ 是 —— 每个主域名需独立证书 • 需在 PbootCMS 后台 → 系统设置中开启「多语言」或「多站点」模式(V3.2.12 支持)
• 实际仍是单程序,但通过域名匹配加载不同模板

? 搜索数据佐证:

  • “PbootCMS 支持多语言多区域建站并支持绑定域名”
  • “后台可自由切换中英文站内容”,说明其原生支持基于 HTTP_HOST 的多域名逻辑。

?️ 二、Nginx 实战配置(2026 最简可靠方案)

✅ 步骤 1:为每个子域名单独申请证书(Certbot)

# 一次性为全部子域名申请(推荐:通配符证书更优,见下文)
sudo certbot --nginx -d example.com -d www.example.com -d m.example.com -d en.example.com
# 或分别申请(适合分阶段上线)
sudo certbot --nginx -d example.com -d www.example.com
sudo certbot --nginx -d m.example.com
sudo certbot --nginx -d en.example.com

? 关键优势:Certbot 会为每个 -d 参数生成同一份证书文件(含多个 SAN),并自动在 Nginx 中复用路径,无需管理多套证书文件。


✅ 步骤 2:Nginx 配置 —— 每个子域名独立 server 块(重点!)

# === 主站 & WWW 域名 ===
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl http2;
    server_name example.com www.example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    root /www/wwwroot/pbootcms;  # ✅ 所有子域名共用同一根目录!
    index index.php;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}
# === 手机站子域名 ===
server {
    listen 80;
    server_name m.example.com;
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl http2;
    server_name m.example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;   # ✅ 复用同一证书!
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    root /www/wwwroot/pbootcms;  # ✅ 完全相同路径
    index index.php;
    # ✅ 关键:重写规则,让 PbootCMS 知道这是“手机站”
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        # 可选:传递设备标识给 PHP(供模板判断)
        set $device "mobile";
        fastcgi_param HTTP_DEVICE $device;
    }
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}
# === 英文站子域名 ===
server {
    listen 80;
    server_name en.example.com;
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl http2;
    server_name en.example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;   # ✅ 复用!
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    root /www/wwwroot/pbootcms;
    index index.php;
    # ✅ 关键:强制语言为英文(通过 URL 参数或后台配置)
    location / {
        try_files $uri $uri/ /index.php?lang=en&$query_string;  # 方式1:URL传参
        # 或方式2:在模板中用 {pboot:langurl code=en} 生成链接
    }
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

✅ 为什么能共用同一证书?
Let’s Encrypt 允许在一张证书中包含多个域名(Subject Alternative Names, SAN)。Certbot 默认将所有 -d 域名写入同一张证书,路径统一为 /etc/letsencrypt/live/example.com/ —— 您无需为每个子域名创建新证书路径。


? 三、终极推荐:使用通配符证书(Wildcard)——最优雅方案

✅ 优势(搜索数据高频推荐)

  • ✅ 一次申请,永久覆盖所有子域名(*.example.com)
  • ✅ 自动续期时,所有子域名证书同步更新(无遗漏风险)
  • ✅ Nginx 配置极度简化(一个证书路径复用全部 server_name)
  • ✅ 符合 PbootCMS 多域名设计哲学

? 操作步骤(DNS 验证,需域名解析权限)

# 1. 安装 acme.sh(比 Certbot 更适合通配符)
curl https://get.acme.sh | sh
~/.acme.sh/acme.sh --register-account -m you@example.com
# 2. 为 *.example.com 申请通配符证书(以 Cloudflare DNS 为例)
export CF_Key="your_cloudflare_api_key"
export CF_Email="you@example.com"
~/.acme.sh/acme.sh --issue --dns dns_cf -d example.com -d "*.example.com"
# 3. 安装证书到 Nginx(自动重载)
~/.acme.sh/acme.sh --installcert -d example.com \
  --key-file       /etc/nginx/ssl/example.com.key  \
  --fullchain-file /etc/nginx/ssl/example.com.crt \
  --reloadcmd     "nginx -s reload"
# 4. Nginx 中直接复用:
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;

? 通配符证书注意事项:

  • 必须使用 DNS 验证(不能 HTTP),需在 Cloudflare/阿里云/腾讯云后台添加 TXT 记录;
  • *.example.com 不匹配 example.com(主域名),所以必须同时申请 -d example.com -d "*.example.com";
  • PbootCMS 完全兼容,无需任何改动。

? 四、PbootCMS 后台与模板配合(实现“形神兼备”)

虽然 PbootCMS 不需要配置 HTTPS,但为不同子域名提供差异化体验,您可在以下位置微调:

位置 操作 效果 是否必需
后台 → 系统设置 → 网站信息 将「网站地址」留空(推荐)或填 https://example.com(主域名) ✅ 所有 {pboot:siteurl} 标签自动跟随当前访问协议和域名 ✅ 推荐留空,最灵活
后台 → 语言管理 添加 en 语言 → 设置默认语言为 en → 在 en.example.com 的 Nginx 中加 ?lang=en 参数 ✅ en.example.com 自动加载英文模板和内容 ✅ 多语言站必备
模板 index.html 中 使用 {pboot:langname} 判断当前语言:
{pboot:if({pboot:langname}=='中文')}...{/pboot:if}
✅ 同一模板内条件渲染不同文案/Logo/联系方式 ⚠️ 高级定制才需
模板中动态生成跳转链接 <a href="{pboot:langurl code=en}">English</a> ✅ 点击后跳转至 en.example.com(需后台启用多语言) ✅ 推荐,SEO友好

✅ 搜索数据验证:PbootCMS 官方文档明确支持 {pboot:langurl} 生成跨域名语言链接。


? 五、自动续期可靠性保障(避免子域名掉证)

✅ Certbot 用户(多域名证书)

# 查看所有证书及关联域名
sudo certbot certificates
# 续期命令(自动覆盖全部域名)
sudo certbot renew --force-renewal  # 强制测试
sudo certbot renew                 # 生产运行(每天自动)

Certbot 的 renew 命令会扫描 /etc/letsencrypt/renewal/ 下所有配置,只要您的子域名都在同一份 .conf 文件中(如 example.com.conf),就会一起续期。

✅ acme.sh 用户(通配符证书)

# 查看证书详情
~/.acme.sh/acme.sh --info -d example.com
# 手动续期(自动检测过期)
~/.acme.sh/acme.sh --renew -d example.com -d "*.example.com" --force
# 设置自动续期(已默认启用)
~/.acme.sh/acme.sh --upgrade --auto-upgrade

? 六、高频故障排查(搜索数据真实案例)

现象 原因 解决方案
m.example.com 能打开,但提示“证书不匹配” Nginx server_name m.example.com; 未在 ssl_certificate 块中声明该域名 ✅ 在 ssl_certificate 对应的 server{} 块中确认 server_name 包含 m.example.com
续期后 en.example.com 白屏,其他正常 en.example.com 的 server{} 块中 ssl_certificate 路径错误(如写成 /en/ 子目录) ✅ 全部子域名必须指向同一证书路径(如 /etc/letsencrypt/live/example.com/fullchain.pem)
微信打开 m.example.com 提示“网页暂时无法访问” 微信要求 JS 接口安全域名必须在公众号后台逐一备案 ✅ 登录 mp.weixin.qq.com → 公众号设置 → 功能设置 → JS接口安全域名 → 添加 m.example.com, en.example.com

? 附:一键检测脚本(验证所有子域名 HTTPS 健康度)

#!/bin/bash
DOMAINS=("example.com" "www.example.com" "m.example.com" "en.example.com")
echo "=== PbootCMS 多子域名 HTTPS 健康检查 ==="
for d in "${DOMAINS[@]}"; do
    echo -n "$d: "
    if curl -I "https://$d" -s -o /dev/null -w "%{http_code}\n" -k | grep -q "200"; then
        echo "✅ OK"
    else
        echo "❌ FAIL"
        echo "   → 检查 Nginx server_name 和证书路径"
    fi
done
echo -e "\n证书有效期检查:"
openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -text -noout 2>/dev/null | grep "Not After"

✅ 运行:chmod +x check-multi-https.sh && ./check-multi-https.sh



声明:
1.本站主要是为了记录工作学习中遇到的问题,可能由于本人技术有限,内容难免有纰漏,一切内容仅供参考。
2.本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!
3.本站所有原创作品,包括文字、资料、图片、网页格式,转载时请标注作者与来源。

------------------------------------------------------------------------------------------------


出处:网际迅联
网址:https://www.wjxlkj.com


联系方式:

手机号码:13910758317

微信:13910758317

客服QQ:58053012


或下图二维码微信扫码或长按识别添加微信



阅读:189    评论:0
  • 相关文章
  • 热门文章
联系我们 - 支付方式 - 购买商业版 - 际迅联淘宝店 - 网站地图


  TCP/IP备案号:京ICP备15035957号-3
【电脑版】  【回到顶部】