直接套用宝塔默认伪静态规则会导致tp6多应用404,因其仅适配单应用模式,将所有请求重写为/index.php?s=$1,而多应用需依赖路径首段(如/admin)识别应用名;nginx未匹配真实文件时直接返回404,框架无法启动。

为什么直接套宝塔默认伪静态规则会导致多应用404
因为宝塔内置的 ThinkPHP 伪静态模板只适配单应用模式,它把所有请求统一重写为 /index.php?s=$1,而 TP6 多应用依赖路径第一段(如 /admin/login 中的 admin)来识别应用名。Nginx 在没匹配到真实文件时直接返回 404,根本没把请求交给 index.php,框架连启动机会都没有。
常见现象:首页能打开,点任何菜单或访问子应用路径(如 /admin)就报 404;或者所有请求都进默认 index 应用,admin、api 完全不生效。
- 必须删除宝塔面板里已有的 ThinkPHP 伪静态规则
- 不能用
try_files $uri $uri/ /index.php?$query_string—— 这会让$_SERVER['PATH_INFO']为空,TP6 多应用路由解析失败 - 正则中应用名字符集要覆盖实际命名,比如含下划线就得加
_,含短横就得加-
多应用专用 Nginx 伪静态规则怎么写
规则核心是「两段捕获 + last 重写」,确保应用前缀和后续路径都被透传给 index.php,由框架自己解析。
在宝塔站点设置 → 「伪静态」中粘贴以下内容(注意空格和分号):
if (!-e $request_filename) {
rewrite ^/([a-z0-9A-Z_\-]+)/(.*)$ /index.php?s=$1/$2 last;
rewrite ^/(.*)$ /index.php?s=$1 last;
}
说明:
- 第一行匹配带应用前缀的请求(如
/admin/login),提取admin和login,拼成s=admin/login - 第二行兜底匹配根路径、静态资源路径等(如
/robots.txt或/),避免漏转发 -
last是关键——它让重写后重新进入 location 匹配流程,确保 PHP-FPM 正确加载;用break会导致PATH_INFO丢失 - 如果应用名含中文或特殊符号(不推荐),需扩展正则,例如
^/([^/]+)/(.*)$,但会降低安全性
运行目录和 PHP 配置不设对,规则再准也白搭
TP6 强制要求 Web 入口只能是 public/ 目录,否则 config/、app/ 可被直接访问,且 index.php 无法正确加载框架。
操作必须严格按顺序执行:
- 进宝塔 → 网站 → 对应站点 → 设置 → 网站目录 → 运行目录 → 从下拉菜单中选择
/public(不是手动输入,也不是留空) - 点完立刻点击右上角「重载 Nginx」——只点「保存」无效,旧进程仍在跑
- 检查 PHP 配置:进软件商店 → 找到当前 PHP 版本 → 设置 → 配置修改 → 搜索
disable_functions→ 删除其中的scandir - 确认
fastcgi_param PATH_INFO $fastcgi_path_info;这行在 PHP-FPM 配置中未被注释(宝塔默认开启,但升级后可能重置)
app_map 映射没生效?先看这三处
伪静态把路径传进来了,但框架仍走错应用,大概率是 app_map 配置没起作用,或底层开关没打开。
检查点:
- 主配置
config/app.php中必须显式设置'app_multi' => true,否则框架始终以单应用模式启动 -
app_map必须写在主配置里,格式为'admin' => 'admin'(键是 URL 前缀,值是app/下的目录名),不能写成'/admin' => 'admin'或'admin/' => 'admin' - 应用目录结构必须严格为
app/admin/config/app.php,而不是app/admin/app.php;该文件只控制本应用行为,不继承主配置 - 若用子域名(如
admin.example.com)而非子路径,app_map键应写完整域名:'admin.example.com' => 'admin',且 DNS 和 Nginx server_name 必须精确匹配
最常被忽略的是:改完 app_map 或 app_multi 后没清缓存,php think:clear 或删掉 runtime/cache/ 下所有文件再试。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











