在宝塔面板(BT Panel)中为不同子域名绑定多个网站,核心逻辑其实非常清晰:“一个网站对应一个独立目录,通过 Nginx/Apache 配置将不同的域名解析到这个目录”。
很多新手容易混淆“添加站点”和“修改绑定”的概念,导致出现 403 Forbidden 或者默认首页混乱的问题。下面我按最稳定、最符合生产环境规范的方式,分步骤拆解操作流程,并补充一些避坑指南。
一、 前置条件确认
- DNS 解析已完成:确保你的主域名
example.com和子域名a.example.com、b.example.com都已经正确解析到了你服务器的公网 IP。 - SSL 证书准备(可选但推荐):如果你打算启用 HTTPS,建议先申请好泛域名证书或各子域名的独立证书。
二、 标准操作流程(推荐方式)
第一步:创建第一个主站点(基础站点)
假设你的主域名是 example.com,对应的业务是官网。
- 进入宝塔面板 -> 网站 -> 添加站点。
- 域名填写:
example.com - 根目录:保持默认,如
/www/wwwroot/example.com - PHP 版本:根据项目需求选择(如 PHP-7.4, PHP-8.1 等)。
- 数据库/FTP:按需创建。
- 点击 提交。
此时,你拥有了第一个独立的网站容器。
第二步:添加第二个子域名站点(关键步骤)
假设你要为子域名 shop.example.com 搭建一个商城系统。
错误做法:直接在第一个站点的“设置”里添加 shop.example.com 作为附加域名。这会导致两个子域名共用同一个代码目录和 PHP 进程池,一旦其中一个需要不同的 PHP 版本或伪静态规则,就会互相干扰。
正确做法:再次点击“添加站点”。
- 域名填写:
shop.example.com - 根目录:建议新建一个文件夹,如
/www/wwwroot/shop.example.com(宝塔通常会自动创建)。 - PHP 版本:如果商城系统和官网一样,选相同版本;如果需要隔离,可以选不同版本。
- 数据库:创建一个独立的数据库用户,权限仅限该子域名使用。
- 点击 提交。
重复此步骤,你可以无限添加子域名站点,每个子域名都是一个完全独立的 Web 服务实例。
第三步:上传代码与部署
- 进入 文件 管理界面。
- 找到对应子域名的根目录(如
/www/wwwroot/shop.example.com)。 - 上传你的程序代码(WordPress、ThinkPHP、Vue 打包文件等)。
- 确保入口文件(如
index.php或index.html)存在于根目录下。
第四步:配置伪静态(Nginx Rewrite)
大多数现代框架(Laravel, ThinkPHP, Vue/React SPA)都需要伪静态支持。
- 回到 网站 列表。
- 点击目标子域名右侧的 设置。
- 找到 伪静态 下拉菜单。
- 选择对应的规则(如 Laravel, ThinkPHP, Vue 等)。如果没有预设规则,可手动编写 Nginx 配置块。
注意:不要把所有子域名的伪静态都写在主站点的配置文件里,每个站点应拥有独立的
.conf文件。
第五步:配置 SSL 证书(HTTPS)
为了安全性及浏览器兼容性,强烈建议为所有子域名开启 HTTPS。
- 在 网站 -> 设置 -> SSL 标签页。
- 选择 Let’s Encrypt 自动申请(免费,但需域名已解析且端口 80 开放)。
- 如果是单个子域名,直接勾选该子域名即可。
- 如果是多个子域名,建议使用 泛域名证书(Wildcard Certificate),例如
*.example.com,这样可以覆盖所有未单独申请的子域名。
- 勾选 强制 HTTPS。
- 保存。
三、 高级技巧:如何高效管理大量子域名?
如果你需要绑定几十个甚至上百个子域名,逐个添加站点效率极低。以下是两种进阶方案:
方案 A:使用“反向XX” + “动态子域名”(适合 SaaS 或多租户场景)
假设你有一个主应用 app.example.com,希望 user1.app.example.com, user2.app.example.com 都能访问,但实际指向同一套代码,只是通过 URL 参数区分用户。
- 只添加一个主站点
app.example.com。 - 在 设置 -> 反向XX 中,确保没有冲突。
- 在 伪静态 中,利用 Nginx 变量
$host或$server_name来识别子域名。# 示例:根据子域名加载不同配置 if ($host ~* ^(.+).app.example.com$) { set $subdomain $1; } - 这种方式适合前后端分离架构,后端 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 等)。 |
五、 总结与建议
- 隔离原则:每个子域名尽量作为网站点创建,便于权限管理、日志分离和故障隔离。
- 资源控制:如果子域名众多,注意 CPU 和内存占用。可在宝塔 安全 页面限制每个站点的并发连接数(Max Connections)。
- 备份习惯:在大规模调整前,务必备份数据库和网站文件。
- 合规性提醒:确保所有子域名内容符合中国网络安全法要求,完成 ICP 备案(如需在国内主机部署)。未备案域名会被云厂商封禁 80/443 端口。
通过以上步骤,你可以清晰、稳定地在宝塔面板中管理任意数量的子域名网站。如有具体报错信息,可提供 Nginx 错误日志进一步分析。
云技术博客