ThinkPHP 5.1 域名绑定需在 route/app.php 中用 Route::domain() 定义,第二参数须为闭包或数组,本地开发需匹配带端口的 HTTP_HOST 并配置 hosts 和 Web 服务器指向 public 目录。

ThinkPHP 5.1 配置域名绑定应用,核心是「路由层绑定」+「本地环境准备」,不是靠 Nginx/Apache 虚拟主机决定逻辑走向,而是由框架在请求进入时根据 HTTP_HOST 主动匹配并调度到对应模块或路由分组。关键不在服务器配置多复杂,而在三点:写对位置、用对语法、配对开发环境。
必须写在 route/app.php 里
域名路由规则只能定义在 route/app.php(不是 config/route.php,也不是 app/middleware.php 或控制器里)。其他位置写的 Route::domain() 完全不生效,请求会直接 404。
- 确认你编辑的是项目根目录下
route/app.php文件(TP5.1 默认路由入口) - 不要误用
route/route.php—— 它仅支持闭包式简单路由,不支持domain()分组 - 多应用模式(如
app/admin/)下,所有域名绑定仍统一写在route/app.php,不能按应用拆开
正确写法:闭包或数组,不能传字符串
Route::domain() 第二个参数必须是闭包函数或返回路由规则的数组,**绝不能是字符串路径**(比如 'admin/index/index'),否则报错 Invalid route rule。
- ✅ 正确(闭包):
use think\facade\Route;
Route::domain('admin.example.com', function () {
Route::get('/', 'admin.Index/index');
Route::get('user/:id', 'admin.User/read');
}); - ✅ 正确(数组):
Route::domain('api.example.com', require 'route/api.php');(其中route/api.php必须return [];) - ❌ 错误:
Route::domain('admin.example.com', 'admin.Index/index');
本地开发要匹配完整 Host(含端口)
本地运行时,浏览器访问的地址可能是 http://localhost:8080 或 http://127.0.0.1:8000,而 $_SERVER['HTTP_HOST'] 值就是这个带端口的字符串。如果你只写 Route::domain('test.com', [...]),它永远不匹配。
立即学习“PHP免费学习笔记(深入)”;
- 开发阶段建议加判断:
if (env('APP_DEBUG')) {
Route::domain('localhost:8080', [...]);
// 或 Route::domain('127.0.0.1:8000', [...]);
} - hosts 文件需提前映射(如
127.0.0.1 admin.test),再配合 Apache/Nginx 把admin.test指向项目public/目录 - 若用宝塔或 PHPStudy,记得在虚拟主机设置中把域名根目录指向
your-project/public,并开启伪静态(隐藏 index.php)
绑定后如何让 / 直接进后台首页?
域名绑定本身只是划分路由空间,不会自动重定向根路径。例如绑定了 admin.example.com,访问 admin.example.com/ 默认 404,除非你显式定义:
Route::get('/', 'admin.Index/index');- 或者用资源路由:
Route::resource('', 'admin.Index');(空字符串表示根) - 注意:不要和全局
bind('admin')混用,否则模块前缀重复,报错Class admin\controller\admin\Index does not exist



















