实现ThinkPHP多应用域名绑定,需要先安装多应用扩展,删除默认的控制器目录,创建各个子应用目录并配置域名绑定数组,在路由配置文件中注册各域名对应的路由规则,同时务必确保Nginx或Apache正确透传主机头。
搞ThinkPHP二级域名绑定,很多人以为改个配置就完事了,其实远没那么简单。你得让框架识别出访问的是哪个域名,然后自动加载对应的应用模块,这才是核心。而要实现这个效果,需要把结构、配置、路由、服务器这四样东西都安排明白,缺一环都不行。下面就把关键操作和常见踩坑点掰开揉碎了讲清楚。
这是前提,结构不对,后面全白忙。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
composer require topthink/think-multi-app 安装多应用扩展app/controller 目录——这是单应用的标志,不删掉,框架就不会进入多应用模式php think build admin、php think build api,生成 app/admin/、app/api/ 等目录controller/、route.php、config/、middleware.phpconfig/app.php 中已设置 'auto_multi_app' => true 且 'app_namespace' => 'app'TP6/8 已经废弃了 APP_SUB_DOMAIN_DEPLOY,必须用 domain_bind 数组做硬绑定,否则框架无法切换应用上下文。
config/app.php 中添加或修改:'url_domain_deploy' => true,'domain_bind' => [ 'admin.example.com' => 'admin', 'api.example.com' => 'api', '*' => 'index']admin.example.com),不能只写 admin;本地开发时若用 localhost:8000,就得写 'localhost:8000' => 'admin'app/ 下的目录名,且该目录存在、结构完整这一步不是可选的,而是必须——只有写在这里,框架才会把域名作为路由解析入口。
route/app.php(注意,不是 config/route.php 或 app/common/route.php)use thinkRoute;Route::domain('admin.example.com', function () { Route::get('login', 'index/login');});Route::domain() 第二个参数只能是闭包或数组,不能是字符串路径(如 'admin/index/login' 会报错)Route::domain('*', ...),但要放在精确匹配之后如果 Nginx 或 Apache 没把原始域名传给 PHP,框架连 $_SERVER['HTTP_HOST'] 都拿不到,前面所有配置都白搭。
fastcgi_param HTTP_HOST $host;public/ 目录mod_rewrite,虚拟主机中设置 DocumentRoot 为 public/,并开启 AllowOverride All127.0.0.1 admin.example.comvar_dump($_SERVER['HTTP_HOST']) 确认实际收到的值是否与配置一致
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述