tp6伪静态404不是框架问题,而是nginx未转发请求至index.php:需确保location /在location ~ .php$之前、fastcgi_split_path_info与path_info参数正确传递、运行目录设为/public。

TP6伪静态404不是框架改了,是环境被动了
ThinkPHP 5.1 升级到 6.0 后伪静态大面积 404,90% 的情况跟框架本身无关。TP6 的路由机制和重写逻辑在 6.x 全系列中保持稳定,真正出问题的是 Nginx 配置被覆盖、PHP-FPM 参数丢失、或宝塔「一键优化」清掉了关键行。升级脚本不会动服务器配置,但人手操作或面板自动更新会。
宝塔里最该检查的三处配置
别急着重写规则,先确认这三项是否完好:
-
location /块必须在location ~ \.php$之前,否则 rewrite 根本不触发 -
fastcgi_split_path_info ^(.+\.php)(/.+)$;和fastcgi_param PATH_INFO $fastcgi_path_info;这两行必须存在于 PHP-FPM 的 fastcgi_params 区域,且未被注释——缺一不可,否则/index/index解析失败 - 站点「运行目录」必须设为
/public(TP6 默认入口),否则所有 rewrite 路径都偏移一级
常见错误:宝塔升级 PHP 版本后,fastcgi_param PATH_INFO 行被自动清空;或者「网站配置文件」里残留旧的 if (!-e $request_filename) 块,与新版 try_files 冲突导致 internal redirection cycle。
Nginx 规则必须用 try_files,别再套 if + rewrite
PHP 8.4+ 对 if 在 location 块中的使用更严格,旧式写法容易被跳过或引发循环。直接替换为标准 try_files:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
注意三点:
- 如果项目部署在二级目录(如
/myapp/),要改成location /myapp/,且 fallback 路径为/myapp/index.php?$query_string - 务必保留
$query_string,否则?lang=zh-cn这类参数丢失,多语言会 fallback 到 en-us - 若入口在
/public,而站点根目录没设成该目录,则需把/index.php改为/public/index.php
验证是否真进框架,别只测首页
首页能打开 ≠ 伪静态生效。用这三步交叉验证:
- 访问一个绝对不存在的路径,例如
https://yoursite.com/xyzabc123—— 若返回 ThinkPHP 自带的 404 页面(含 debug 信息或自定义模板),说明请求已进框架;若返回 Nginx 默认 404,说明 rewrite 没生效 - 在
public/index.php顶部加一行var_dump($_SERVER['PATH_INFO']);die;,访问/index/index,输出应为/index/index,为空就证明 PATH_INFO 没传进来 - 检查日志:
/www/wwwlogs/yourdomain_error.log里是否有rewrite or internal redirection cycle,有则说明 location 块重复或 last/break 用错
PATH_INFO 为空、$_GET 为空、多语言 fallback,这些表象背后往往都是同一根线头——Nginx 没把 query string 或 pathinfo 正确交给 PHP-FPM。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











