tp6伪静态失效主因是环境变更而非框架升级,需检查nginx配置是否同步、php-fpm中fastcgi_split_path_info与path_info参数是否缺失、宝塔是否覆盖自定义规则,并确认rewrite规则位置及last修饰符正确性。

ThinkPHP 伪静态配置本身不随“多语言版本更新”变化,TP6 的路由机制和服务器重写逻辑在 6.x 全系列中保持稳定。所谓“升级后伪静态失效”,90% 是因 Nginx 配置未同步、PHP-FPM 参数被重置,或宝塔面板升级时自动覆盖了自定义规则。
为什么 TP6 升级后伪静态突然 404
不是框架改了,而是环境被动了。常见触发点:
-
宝塔升级 PHP 版本后,fastcgi_param PATH_INFO $fastcgi_path_info;这行常被清空或注释掉 —— 导致/index/index这类路径无法解析为控制器/方法 -
nginx.conf或站点配置被宝塔「一键优化」覆盖,原有location /块消失,只剩默认的try_files模板 - 升级后
public/目录权限变更(如从 755 变成 750),Nginx 用户(如www)读不到文件,直接返回 404(非框架 404,是 Nginx 层面的) -
url_route_on在config/app.php中被误设为false—— TP6 默认开启,但某些升级脚本会强行重写配置文件
宝塔里最稳的 TP6 伪静态写法(升级后必查)
别信「伪静态模板」下拉框里那些过时规则。直接进「网站 → 配置文件」,在 server 块内、location ~ \.php$ 之前插入:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
重点确认三件事:
- 必须放在
location ~ \.php$之前,否则所有请求先匹配到 PHP 块,rewrite根本不执行 -
last不能换成break或redirect——last才会触发重匹配,让/index.php?s=/index/test进入 PHP 处理流程 - 删掉任何重复的
location /块,避免rewrite or internal redirection cycle错误(看/www/wwwlogs/yourdomain_error.log)
PHP-FPM 层必须保留的关键参数
进入宝塔 → 网站 → 对应站点 → PHP 版本 → 设置 → 配置修改,在 fastcgi_params 区域确认以下两行存在且未被注释:
fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info;
如果缺失,手动补上并保存;然后点击「重载 PHP」。这是 /index/index 能被识别为控制器+方法的底层依赖,和 rewrite 规则是搭档关系,缺一不可。
验证是否真生效,而不是“看起来正常”
别只测首页。用这三步交叉验证:
- 访问
https://yoursite.com/abc123(一个绝对不存在的路由)→ 返回 ThinkPHP 自带的 404 页面,说明请求已进框架;若返回 Nginx 默认 404,说明 rewrite 没生效 - 访问
https://yoursite.com/index.php/index/test→ 正常;但https://yoursite.com/index/test→ 404?那就是PATH_INFO解析失败,回头检查 PHP-FPM 配置 - 在
public/index.php开头加一行:file_put_contents('/tmp/tp6_uri.log', $_SERVER['REQUEST_URI'].PHP_EOL, FILE_APPEND);,再刷新几个页面,看日志里记录的是原始 URL 还是重写后的/index.php?s=...
升级后最容易被忽略的,是 PHP-FPM 配置那两行参数 —— 它不报错,但会让所有带斜杠的路由静默降级为 index.php 入口,却无法拆解 pathinfo,最终控制器全 404。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











