ThinkPHP多域名绑定失效主因是配置链断裂,需依次检查DNS解析、Web服务器透传(含HTTP_HOST传递)、框架识别及应用分发;三类绑定模式(子域名映射模块、Route::domain()路由过滤、多应用硬绑定)必须严格匹配使用场景。

ThinkPHP多域名绑定失效,90%不是代码写错,而是配置链断在某个环节——从DNS解析、Web服务器透传、框架识别到应用分发,漏掉任意一环都会导致404、跳默认应用或控制器找不到。
检查域名是否真正抵达框架入口
本地或线上访问子域名时直接报DNS错误、连接拒绝或空白页,说明请求根本没进到ThinkPHP。必须确认三件事:
- hosts文件已添加对应条目(如127.0.0.1 admin.example.com),Windows在C:\Windows\System32\drivers\etc\hosts,macOS/Linux在/etc/hosts
- Web服务器明确配置了该域名:Nginx的server_name admin.example.com;,Apache的ServerName admin.example.com,且DocumentRoot或root指向项目public/目录
- Nginx需确保fastcgi_param HTTP_HOST $http_host;已写入,否则$_SERVER['HTTP_HOST']为空或为127.0.0.1,框架无法读取真实域名
确认绑定方式与模式严格匹配
ThinkPHP有三种主流域名分发场景,用错模式必然失效:
- 单应用+子域名映射模块:启用APP_SUB_DOMAIN_DEPLOY => 1,配APP_SUB_DOMAIN_RULES => ['admin' => 'admin'],域名admin.example.com自动进app/admin/模块
- 单应用+Route::domain()路由层过滤:只适合同一应用内区分逻辑(如api.example.com和www.example.com都走app/),所有路由必须写在Route::domain()闭包内,不能复用全局规则
- 多应用+域名硬绑定:必须在public/index.php开头手动调\think\App::bind('admin'),config/app.php里的domain_bind完全无效;每个应用需独立app/admin/route.php,且default_route设为true
验证路由注册与上下文是否生效
即使域名抵达框架,也常因路由未正确加载而404:
- 运行php think route:list,它默认只显示主域名路由;要查子域规则,改用var_dump(Route::getRules()),看domain键下是否有对应数组
- Route::domain()是独立作用域,里面必须重新定义全部路由,例如Route::get('index', 'Index/index'),不能指望外部规则自动继承
- 泛域名Route::domain('*')有效,但Route::domain('*.example.com')无效;它优先级低于显式域名,仅作兜底
- URL生成函数url()默认不带域名,需在config/route.php中开启url_domain_deploy => true才生效
排查Cookie、Session与静态资源连带问题
绑定后登录态丢失、AJAX跨域失败、CSS路径404,往往被误认为路由问题,实则是配套配置缺失:
- Session跨子域共享:在public/index.php最开头加ini_set('session.cookie_domain', '.example.com');,注意开头的点,且HTTPS环境必须配session.cookie_secure => 1
- Cookie跨域:修改config/cookie.php中domain为'.example.com',并确保前端fetch/axios请求带上credentials: 'include'
- 静态资源路径错乱:多应用下static()函数不感知当前应用,应改用绝对路径如/static/admin/css/app.css,避免拼接错误
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











