必须同时开启url_domain_deploy开关、在application/route.php中用route::domain()注册规则(推荐闭包方式)、nginx配置fastcgi_param http_host $host并指向public目录,三者缺一即导致404或跳转默认模块。

要在ThinkPHP5.0中实现域名部署,必须同时满足三个硬性条件:开启url_domain_deploy开关、在route.php中正确注册Route::domain()规则、确保Web服务器透传原始HTTP_HOST头;缺一即导致404或跳转到默认模块。
启用域名部署开关
打开application/config.php文件,在顶层配置数组中添加或确认存在以下键值对:
'url_domain_deploy' => true,
注意:【不能写在app子数组或route子数组里】,也不能使用已废弃的APP_SUB_DOMAIN_DEPLOY——该配置在TP5.1+中完全无效,写上也无作用。若项目是单应用结构(即根目录下存在app/controller/),此开关即使开启也无效,必须先转为多应用模式。
在route.php中注册域名路由规则
域名绑定逻辑只能写在application/route.php(不是route/app.php,后者是TP6路径),且必须在use think\Route;之后立即调用。
方法一:子域名绑定到模块(推荐初用)
Route::domain('admin', 'admin');
这行代码表示访问admin.example.com时,自动加载app/admin/下的控制器。但注意:【第二参数为字符串仅在TP5.0早期版本支持,TP5.0.24+已要求闭包或数组】,生产环境请优先用方法二。
方法二:闭包方式定义完整路由(兼容性最强)
第一步:在application/route.php中写入:
use think\Route;
第二步:添加子域名闭包路由:
Route::domain('api', function () { Route::get('v1/users', 'api.User/index'); Route::post('v1/login', 'api.Auth/login'); });
第三步:确保该闭包前没有Route::domain('*')泛规则,否则会被提前截断。
方法三:完整域名绑定(含端口适配)
本地调试时,若用http://admin.test:8080访问,HTTP_HOST实际为admin.test:8080,此时必须写成:
Route::domain('admin.test:8080', function () { /* 路由 */ });
线上环境无需端口,直接写admin.example.com即可。
配置Nginx透传Host头并指向public目录
新建一个Nginx server块,server_name必须包含你要绑定的域名:
server_name admin.example.com;
root必须指向项目public/目录:
root /var/www/myproject/public;
关键:fastcgi_param必须用$host而非$server_name:
fastcgi_param HTTP_HOST $host;
漏掉这行,TP5将收不到真实子域名,$_SERVER['HTTP_HOST']会变成localhost或IP,所有域名绑定失效。
本地开发需修改hosts文件
Windows用户编辑C:\Windows\System32\drivers\etc\hosts,追加:
127.0.0.1 admin.example.com
127.0.0.1 api.example.com
macOS/Linux用户编辑/etc/hosts,内容相同。不加这一项,浏览器根本不会向本机发请求,更谈不上PHP层匹配。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











