多应用配置隔离失效的核心原因是Nginx伪静态未适配、运行目录与PHP设置不匹配、框架路由分组未启用及配置缓存未更新。需同步调整Nginx重写规则(含last)、宝塔运行目录设为/public、禁用putenv/ini_set、开启url_domain_deploy、使用Route::domain()分组,并执行php think config:clear与config:cache。

多应用配置隔离失效,核心原因是框架未真正进入应用级隔离流程,或服务器层与框架层配置不协同。不是改个配置就能解决,得从Nginx转发、运行目录、PHP环境、框架开关四个层面逐项对齐。
Nginx伪静态必须匹配多应用路径结构
TP6/TP8的多应用依赖URL首段识别应用名(如 /admin/login 中的 admin),宝塔默认的单应用规则完全不适用:
- 删掉宝塔面板里已有的“ThinkPHP”伪静态模板(它是为TP5设计的)
- 在每个站点的 server 块中,location / 内粘贴专用规则:
rewrite ^/([a-z0-9A-Z_\-]+)/(.*)$ /index.php?s=$1/$2 last;
rewrite ^/(.*)$ /index.php?s=$1 last;
}
第一行捕获带应用前缀的请求(如 /admin/user → s=admin/user),第二行兜底处理根路径和静态资源;last 是关键,它让重写后重新进入 location 匹配,确保 PHP-FPM 能正确加载对应应用。
运行目录和PHP设置必须强制对齐
规则再准,这两项设错就全白搭:
立即学习“PHP免费学习笔记(深入)”;
- 宝塔 → 网站 → 设置 → 网站目录 → 运行目录 → 必须从下拉菜单选 /public(不能手动填、不能留空)
- 点完立即点右上角「重载Nginx」——只点「保存」无效,旧进程还在跑
- PHP禁用函数中不能勾选 putenv 和 ini_set(TP6/TP8 启动时靠它们动态设置 PATH_INFO)
- 检查PHP处理块是否含 fastcgi_param PATH_INFO $fastcgi_path_info;,且前面有 fastcgi_split_path_info ^(.+\.php)(/.+)$;
框架内必须开启域名/路径路由分组
服务器层分流只是第一步,框架内不隔离,请求仍可能被其他应用路由捕获:
- 在 config/app.php 中设 'url_domain_deploy' => true
- 路由定义改用 Route::domain() 或 Route::prefix() 分组,例如:
// admin 应用专属路由
});
TP8 还需确认 app_multi_module 和 auto_multi_module 均为 true,否则模块发现机制失效,应用目录无法被识别。
检查配置缓存与OPcache是否锁死旧值
修改了 config/app.php 或 .env 却没生效,大概率是缓存没清干净:
- 先执行 php think config:clear 清 runtime/config.php 及子目录
- 再执行 php think config:cache 重建缓存(确保 app_debug => false)
- 若仍返回旧值,检查 PHP OPcache 是否启用:重启 PHP-FPM 或执行 opcache_reset()
- 注意:.env 修改后不会自动重载,必须重建配置缓存才生效



















