thinkphp5二级域名模块路由关键在于开启url_domain_deploy并配置__domain__规则,宝塔需为各子域名单独绑定、dns解析到位、https证书覆盖全域名、运行目录设为/public且伪静态启用thinkphp模板。

ThinkPHP5 在宝塔面板中实现二级域名模块路由(如 admin.example.com → admin 模块),关键不在宝塔本身,而在于 TP5 的域名部署机制 + 宝塔对多域名的正确承接。单纯在宝塔「域名管理」里加一堆子域名,TP5 默认是收不到、也识别不了的。
ThinkPHP5 必须开启 url_domain_deploy
这是整个功能的前提,不打开,TP5 根本不会解析 Host 头做域名路由。在 application/config.php 中确认以下配置已启用:
'url_domain_deploy' => true,
同时确保 application/route.php 中定义了 __domain__ 规则,例如:
return [
'__domain__' => [
'admin' => 'admin',
'api' => 'api',
'shop' => 'shop',
],
];
注意:admin 是请求的子域名前缀(不含 .example.com),右边 'admin' 是模块名,两者可以不同,但必须存在对应模块目录。
宝塔必须为每个子域名单独绑定,且 DNS 解析到位
宝塔不会自动把 admin.example.com 当作 example.com 的别名处理。你必须在站点的「域名管理」里逐个添加:
example.comwww.example.comadmin.example.comapi.example.com
每行一个,不带协议、不带空格或逗号。漏掉任何一个,访问时就会落到默认站点或返回 404。
DNS 层面也要为每个子域名单独配 A 记录(或 CNAME),指向服务器真实 IP。用 ping admin.example.com 和 curl -v http://admin.example.com 验证请求是否真抵达了你的服务器。
HTTPS 证书必须覆盖全部子域名,不能共用主站证书
Let’s Encrypt 默认只签你填在「主域名」框里的那个域名。如果只给 example.com 申请了证书,admin.example.com 访问 HTTPS 就会触发 NET::ERR_CERT_COMMON_NAME_INVALID 错误。
解决方式只有两种:
- 在宝塔 SSL 页面申请证书时,手动勾选所有子域名(支持通配符
*.example.com,但需 DNS 验证) - 若用非通配符证书,必须上传多个证书文件,并手动编辑 Nginx 配置:为每个
server_name admin.example.com块单独指定ssl_certificate和ssl_certificate_key路径
只点「保存配置」没用,改完必须点「重载 Nginx」或执行 nginx -t && nginx -s reload。
运行目录和伪静态不能错位
TP5 的入口文件是 public/index.php,宝塔网站的「运行目录」必须设为 /public(在站点设置 → 网站目录里修改)。否则子域名请求进来后,Nginx 找不到 index.php,直接 404。
伪静态规则也要匹配 TP5 要求,选「thinkphp」模板即可,内容大致是:
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
这个规则必须出现在每个子域名对应的 server 块内(宝塔自动生成的配置里已有),而不是只写在主域名块里。
最常被忽略的是:子域名生效 ≠ TP5 模块路由生效。即使 Nginx 正确转发了请求,如果 url_domain_deploy 关着、或 route.php 里没写 __domain__、或模块目录实际不存在,页面照样空白或报错——这时候问题根本不在宝塔配置层。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











