默认应用需严格配置伪静态规则:Nginx必须将所有路径(含无前缀的/、/login等)转发至/public/index.php,并透传s=参数或PATH_INFO;配套需设运行目录为/public、启用PATH_INFO支持、移除putenv和ini_set禁用。

ThinkPHP 多应用模式下,设置默认应用后伪静态配置不能简化,反而要更严谨——因为默认应用只是框架层的 fallback 逻辑,Nginx 层仍必须把所有路径(包括无前缀的 /、/login、/api/user)准确转发给 public/index.php,并确保 s= 参数或 PATH_INFO 正确透传。否则,默认应用可能“看似能打开首页”,但子路径(如 /user/list)仍 404,或错误路由到其他应用。
默认应用 ≠ 无需伪静态规则
TP6 的默认应用(如在 app.php 中设 'default_app' => 'home')只在 URL 不含应用前缀时生效,例如:
-
/→ 进home应用 -
/admin/login→ 进admin应用 -
/user/profile→ 因无前缀,仍进home应用
但前提是:/user/profile 这个请求必须被 Nginx 转发到 public/index.php,且 s=user/profile 或等效 PATH_INFO 可被框架读取。如果伪静态没配对,Nginx 直接返回 404,框架根本不会启动,default_app 完全无效。
必须使用的伪静态规则(宝塔适用)
在站点「伪静态」设置中,清空原有内容,粘贴以下规则(注意空格、分号、括号):
if (!-e $request_filename) {
rewrite ^/([a-z0-9A-Z_\-]+)/(.*)$ /public/index.php?s=$1/$2 last;
rewrite ^/(.*)$ /public/index.php?s=$1 last;
}
- 第一行捕获带应用前缀的路径(如
/admin/login→s=admin/login) - 第二行兜底处理默认应用路径(如
/、/login、/about→s=login或s=) -
last是强制要求:重写后重新进入 location 匹配,确保 PHP-FPM 正确加载 -
/public/index.php是硬性路径,不可省略为/index.php
三项配套配置缺一不可
光有规则不行,以下三步必须同步完成,否则默认应用照样 404:
运行目录设为
/public
宝塔 → 网站 → 设置 → 网站目录 → 运行目录 → 下拉选择/public(不是手动输入,也不是留空)PHP 禁用函数中移除
putenv和ini_set
TP6 启动时靠这两个函数动态设置PATH_INFO,禁用即导致路由解析失败-
PHP 处理块启用 PATH_INFO 支持
在站点配置的location ~ \.php$块内,确认存在:fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info;
验证是否生效的小技巧
- 访问
/:应进默认应用(如 home) - 访问
/login(无前缀):也应进默认应用,而不是 404 - 访问
/admin:应进 admin 应用,不跳 home - 用
curl -I http://yoursite/login查看响应头,若有X-Powered-By: ThinkPHP,说明请求已进框架;若只有404 Not Found且无该头,说明 Nginx 拦截了,伪静态未生效
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











