根本原因是Nginx或PHP层路径解析失败触发框架兜底301跳转;须确保运行目录设为/public、PATH_INFO正常透传、禁用重复重写规则,并验证public/index.php存在且$_SERVER['PATH_INFO']非空。

ThinkPHP6.0伪静态配置后出现301跳转异常(如访问 /user/profile 被强制重定向到 /index.php/user/profile 或反复跳转),根本原因不是框架主动发起301,而是Nginx或PHP层在路径解析失败时触发了框架内部的“URL规范化重定向”机制——本质是入口未对齐、PATH_INFO丢失或路由未识别导致的兜底跳转。
检查并修正入口文件路径与运行目录
TP6强制要求Web服务器以 public/ 目录为实际运行根目录。若宝塔中“网站目录→运行目录”未设为 /public,Nginx会把请求交给项目根下的 index.php(不存在),框架启动失败,部分中间件(如 UrlEncode 或 TrustHosts)可能触发301跳回带 index.php 的URL。
- 宝塔面板 → 网站 → 设置 → 网站目录 → 运行目录:必须选择
/public(不能留空、不能选/) - 确认
public/index.php文件真实存在且可读,权限为644 - 删除项目根目录下误存的
index.php(TP6不使用它)
禁用框架自动URL重定向行为
TP6在 app/middleware.php 中默认启用 think\middleware\CheckRequestCache 和 think\middleware\ValidatePostSize,但真正引发301的是 think\middleware\AllowCrossDomain 或自定义中间件中调用的 redirect();更常见的是路由未匹配成功时,think\route\dispatch\Url 在解析失败后调用 Response::create()->code(301)->header('Location', ...)。
- 打开
config/app.php,确认'url_route_must' => false(避免路由不匹配直接报错或跳转) - 检查
app/middleware.php是否手动添加了类似RedirectIfNotHttps::class或自定义跳转中间件 - 临时注释掉所有非必要中间件,仅保留
ParseUrl::class和SessionInit::class,测试是否仍跳转
确保Nginx不重复重写、不触发二次跳转
很多301异常源于Nginx规则本身含 permanent 或 redirect 指令,或规则位置错误导致请求被多次重写。例如:
立即学习“PHP免费学习笔记(深入)”;
- 错误写法:
rewrite ^(.*)$ /public/index.php?s=$1 redirect;(redirect强制302跳转,加permanent就是301) - 规则插在
location ~ \.php$块内,造成PHP脚本被反复重写 - 同时存在多段
location /块,Nginx按顺序匹配,后写的覆盖前写的
正确做法:只保留一段 location /,使用 try_files 或 if + rewrite ... last;,且 last 不可替换为 redirect 或 permanent。
验证PATH_INFO是否正常透传
如果 $_SERVER['PATH_INFO'] 为空或为 /index.php/user/profile,TP6无法提取路由参数,就会 fallback 到默认首页或触发重定向。
- 在
public/index.php开头加入调试代码:<?php var_dump($_SERVER['PATH_INFO'], $_SERVER['REQUEST_URI'], $_SERVER['QUERY_STRING']); die(); ?> - 访问
/user/profile,观察输出:
✓ 正常应为string(14) "/user/profile"或类似值
✗ 若为NULL或string(0) "",说明 fastcgi_param PATH_INFO 未启用或fastcgi_split_path_info正则错误 - 检查Nginx PHP处理块中是否包含:
fastcgi_split_path_info ^(.+\.php)(/.+)$;<br>fastcgi_param PATH_INFO $fastcgi_path_info;



















