努力
加油

如何在宝塔面板中为不同子域名绑定多个网站?

在宝塔面板(BT Panel)中为不同子域名绑定多个网站,核心逻辑其实非常清晰:“一个网站对应一个独立目录,通过 Nginx/Apache 配置将不同的域名解析到这个目录”。

很多新手容易混淆“添加站点”和“修改绑定”的概念,导致出现 403 Forbidden 或者默认首页混乱的问题。下面我按最稳定、最符合生产环境规范的方式,分步骤拆解操作流程,并补充一些避坑指南。

一、 前置条件确认

  1. DNS 解析已完成:确保你的主域名 example.com 和子域名 a.example.com、b.example.com 都已经正确解析到了你服务器的公网 IP。
  2. SSL 证书准备(可选但推荐):如果你打算启用 HTTPS,建议先申请好泛域名证书或各子域名的独立证书。

二、 标准操作流程(推荐方式)

第一步:创建第一个主站点(基础站点)

假设你的主域名是 example.com,对应的业务是官网。

  1. 进入宝塔面板 -> 网站 -> 添加站点。
  2. 域名填写:example.com
  3. 根目录:保持默认,如 /www/wwwroot/example.com
  4. PHP 版本:根据项目需求选择(如 PHP-7.4, PHP-8.1 等)。
  5. 数据库/FTP:按需创建。
  6. 点击 提交。

此时,你拥有了第一个独立的网站容器。

第二步:添加第二个子域名站点(关键步骤)

假设你要为子域名 shop.example.com 搭建一个商城系统。

错误做法:直接在第一个站点的“设置”里添加 shop.example.com 作为附加域名。这会导致两个子域名共用同一个代码目录和 PHP 进程池,一旦其中一个需要不同的 PHP 版本或伪静态规则,就会互相干扰。

正确做法:再次点击“添加站点”。

  1. 域名填写:shop.example.com
  2. 根目录:建议新建一个文件夹,如 /www/wwwroot/shop.example.com(宝塔通常会自动创建)。
  3. PHP 版本:如果商城系统和官网一样,选相同版本;如果需要隔离,可以选不同版本。
  4. 数据库:创建一个独立的数据库用户,权限仅限该子域名使用。
  5. 点击 提交。

重复此步骤,你可以无限添加子域名站点,每个子域名都是一个完全独立的 Web 服务实例。

第三步:上传代码与部署

  1. 进入 文件 管理界面。
  2. 找到对应子域名的根目录(如 /www/wwwroot/shop.example.com)。
  3. 上传你的程序代码(WordPress、ThinkPHP、Vue 打包文件等)。
  4. 确保入口文件(如 index.php 或 index.html)存在于根目录下。

第四步:配置伪静态(Nginx Rewrite)

大多数现代框架(Laravel, ThinkPHP, Vue/React SPA)都需要伪静态支持。

  1. 回到 网站 列表。
  2. 点击目标子域名右侧的 设置。
  3. 找到 伪静态 下拉菜单。
  4. 选择对应的规则(如 Laravel, ThinkPHP, Vue 等)。如果没有预设规则,可手动编写 Nginx 配置块。

注意:不要把所有子域名的伪静态都写在主站点的配置文件里,每个站点应拥有独立的 .conf 文件。

第五步:配置 SSL 证书(HTTPS)

为了安全性及浏览器兼容性,强烈建议为所有子域名开启 HTTPS。

  1. 在 网站 -> 设置 -> SSL 标签页。
  2. 选择 Let’s Encrypt 自动申请(免费,但需域名已解析且端口 80 开放)。
    • 如果是单个子域名,直接勾选该子域名即可。
    • 如果是多个子域名,建议使用 泛域名证书(Wildcard Certificate),例如 *.example.com,这样可以覆盖所有未单独申请的子域名。
  3. 勾选 强制 HTTPS。
  4. 保存。

三、 高级技巧:如何高效管理大量子域名?

如果你需要绑定几十个甚至上百个子域名,逐个添加站点效率极低。以下是两种进阶方案:

方案 A:使用“反向XX” + “动态子域名”(适合 SaaS 或多租户场景)

假设你有一个主应用 app.example.com,希望 user1.app.example.com, user2.app.example.com 都能访问,但实际指向同一套代码,只是通过 URL 参数区分用户。

  1. 只添加一个主站点 app.example.com。
  2. 在 设置 -> 反向XX 中,确保没有冲突。
  3. 在 伪静态 中,利用 Nginx 变量 $host 或 $server_name 来识别子域名。
    # 示例:根据子域名加载不同配置
    if ($host ~* ^(.+).app.example.com$) {
        set $subdomain $1;
    }
  4. 这种方式适合前后端分离架构,后端 API 统一处理路由。

方案 B:使用宝塔插件“泛解析”或脚本批量生成

对于传统多站点结构(每个子域名独立代码),可以使用宝塔的 “网站监控” 或第三方插件辅助,但更推荐用 Shell 脚本 自动化创建。

#!/bin/bash
# 批量创建子域名站点的示例脚本(需谨慎测试)
DOMAINS=("a.example.com" "b.example.com" "c.example.com")
ROOT_DIR="/www/wwwroot"

for domain in "${DOMAINS[@]}"; do
    echo "Creating site: $domain"
    bt add_site --domain="$domain" --root="$ROOT_DIR/$domain" --php="php-74" --db="$domain_db" --user="$domain_user" --pass="random_password"
done

⚠️ 警告:此方法涉及底层命令调用,务必先在测试环境验证,避免误删数据。


四、 常见故障排查(Troubleshooting)

问题现象 可能原因 解决方案
访问子域名显示“403 Forbidden” 权限不足或入口文件缺失 检查根目录权限是否为 755(目录)和 644(文件);确认 index.php 或 index.html 存在。
子域名跳转到主域名 Nginx 重定向配置错误 检查主站点伪静态或 SSL 设置中的“强制跳转”,是否错误地包含了子域名。
SSL 证书不生效 DNS 未生效或 Let’s Encrypt 失败 确保子域名 A 记录已全球生效;检查服务器 80/443 端口未被防火墙拦截;尝试手动上传证书。
PHP 版本不匹配 子域名需要特定 PHP 扩展 在宝塔面板左侧 软件商店 -> PHP -> 设置 中,为该子域名安装所需扩展(如 Redis, MySQLi 等)。

五、 总结与建议

  1. 隔离原则:每个子域名尽量作为网站点创建,便于权限管理、日志分离和故障隔离。
  2. 资源控制:如果子域名众多,注意 CPU 和内存占用。可在宝塔 安全 页面限制每个站点的并发连接数(Max Connections)。
  3. 备份习惯:在大规模调整前,务必备份数据库和网站文件。
  4. 合规性提醒:确保所有子域名内容符合中国网络安全法要求,完成 ICP 备案(如需在国内主机部署)。未备案域名会被云厂商封禁 80/443 端口。

通过以上步骤,你可以清晰、稳定地在宝塔面板中管理任意数量的子域名网站。如有具体报错信息,可提供 Nginx 错误日志进一步分析。