thinkphp本地二级域名失败主因是解析、转发、识别三者未对齐:①hosts文件须用管理员/sudo权限编辑,格式为“127.0.0.1 admin.tp6.test”,改后运行ipconfig /flushdns或sudo dscacheutil -flushcache;②web服务器virtualhost/server_name必须严格匹配该域名且documentroot/root指向public/;③框架仅认url_domain_deploy=>true及route::domain()绑定,废弃app_sub_domain_deploy。

ThinkPHP在Windows或macOS本地开发时配二级域名,失败主因不是框架问题,而是系统级解析、Web服务器转发、框架识别三者没对齐。下面按实际排查顺序说清楚每一步该查什么、改哪里、怎么验证。
hosts文件必须写对且刷新缓存
这是整个流程的起点,错一步全盘无效。
- 路径:Windows在C:\Windows\System32\drivers\etc\hosts,macOS/Linux在/etc/hosts;必须用管理员(Windows)或sudo(macOS)权限编辑
- 格式:每行一个映射,IP与域名间只用空格或Tab,不能有下划线、端口或注释;例如:
127.0.0.1 admin.tp6.test
127.0.0.1 api.tp6.test - 改完必须刷新DNS:Windows运行ipconfig /flushdns,macOS运行sudo dscacheutil -flushcache;不刷新,浏览器仍走旧缓存
Web服务器要严格匹配域名并指向public目录
hosts生效后,请求能到本机,但若服务器不认识这个域名或路径不对,照样404。
部署和使用军舰的 macOS Automator 自动化服务集合。包含 5 个实用工作流:PDF转JPG、PNG重命名并转JPG、图像拼接、解压RAR、顺序命名图像文件。一键安装所有服务到 ~/Library/Services/ 目录。使用场景:(1) "安装我的自动化服务",(2) "部署所有 Automato...
- Apache:在httpd-vhosts.conf中为每个子域名单独加VirtualHost块,ServerName必须和hosts里完全一致(如admin.tp6.test),DocumentRoot必须是项目public/目录(不是项目根目录)
- Nginx:在server块中写server_name admin.tp6.test;,root指向/path/to/public;确认location ~ \.php$里有fastcgi_param PATH_INFO $fastcgi_path_info;,否则路由参数丢失
- 通用检查:访问http://admin.tp6.test时,在入口文件public/index.php开头加var_dump($_SERVER['HTTP_HOST']);die();,输出必须是admin.tp6.test——如果不是,说明服务器没把Host头正确传给PHP
ThinkPHP侧只认url_domain_deploy,别碰APP_SUB_DOMAIN_DEPLOY
TP6起,子域名识别开关只有一个有效配置,混用旧配置会导致静默失效。
- 在config/app.php中设'url_domain_deploy' => true;'app_sub_domain_deploy'已废弃,删掉或注释
- 路由绑定统一用Route::domain(),写在route/app.php里:
Route::domain('admin', 'admin'); // admin.tp6.test → app/admin/
Route::domain('api', 'api'); // api.tp6.test → app/api/ - 多应用模式下,确保已执行php think build admin创建了app/admin/目录,且根目录下没有app/controller(存在会禁用多应用)
跨域和Cookie共享要同步处理
二级域名天然跨域,前端带Cookie请求时容易被拦截,本地调试尤其明显。
- Cookie域必须设为.tp6.test(开头带点):在config/session.php中设'cookie_domain' => '.tp6.test';同时在public/index.php开头加ini_set('session.cookie_domain', '.tp6.test');
- 前端fetch需加credentials: 'include';后端CORS中间件不能写Access-Control-Allow-Origin: *,而要动态校验$request->header('origin')是否在白名单内,并设置Access-Control-Allow-Credentials: true
- 本地无法用localhost测Cookie共享——浏览器禁止给localhost设domain属性;务必用admin.tp6.test这类真实二级域名测试
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










