ERR_TOO_MANY_REDIRECTS源于重定向循环,主因包括登录中间件自我触发、Nginx伪静态与PATH_INFO配置冲突、redirect()逻辑陷阱及会话未正确启动。需检查session初始化、修正Nginx规则、避免重复跳转并用Network面板追踪301/302链路。

ThinkPHP 出现重定向循环(如 ERR_TOO_MANY_REDIRECTS 或浏览器卡在 “Redirecting…”),通常不是框架本身缺陷,而是配置、逻辑或环境协同出错的结果。核心问题在于:某次跳转又触发了同一条跳转条件,形成 A → B → A 的闭环。
一、检查登录/权限中间件是否自我触发
后台常用基类中,常通过判断 $_SESSION 是否存在来决定是否 redirect() 到登录页。但如果 session 没真正启动,isset($_SESSION['user']) 永远为 false,就会反复跳转。
-
确认 session_start() 在任何输出前执行:不能有空格、BOM、
echo、warning 输出干扰 header 发送 -
避免在 server.php 等引入文件里提前读写 $_SESSION:必须等
session_start()成功后再操作 -
已登录状态下禁止重复 redirect:比如登录成功后又进到登录控制器,没加
if (isLogin()) { $this->redirect('index/index'); }就可能回跳自身
二、排查 Nginx 伪静态与 PATH_INFO 配置冲突
在 phpEnv、某些精简版 Nginx 环境下,TP6 常因缺少 PATH_INFO 支持而“假 404”——表面是重定向循环,实则是请求根本没进框架,被 Nginx 反复 rewrite。
-
location / 重写规则必须放在
location ~ \.php$之前,且用last(不能用break或redirect) -
手动补全 fastcgi_param PATH_INFO:在
location ~ \.php$块内、include fastcgi.conf前添加:fastcgi_param PATH_INFO $fastcgi_path_info; -
禁用
use_trans_sid:除非明确需无 Cookie 支持,否则开启会导致 URL 反复拼接 PHPSESSID,叠加 rewrite 规则极易触发循环
三、审查 redirect() 调用是否埋了逻辑陷阱
redirect() 本身可靠,但若调用位置不当或参数错乱,会悄悄制造跳转链。
立即学习“PHP免费学习笔记(深入)”;
- 不要在已跳转过的流程里再次 redirect:例如登录验证中间件 redirect 后,控制器又执行一次 redirect
-
慎用 success()/error() 做权限跳转:它们是前端 JS 跳转,失败时无声白屏;权限控制务必用服务端
redirect() -
URL 参数勿传敏感内容:如
redirect('pay/confirm', ['amount'=>999])明文暴露数据,应改用session('pay_data', [...])+ 闪存传递
四、快速定位循环路径的方法
别靠猜,用浏览器开发者工具 Network 面板直接看链路:
- 打开 F12 → Network → 勾选 Preserve log
- 刷新页面,筛选状态码为 301 / 302 的请求
- 顺着 Location 响应头追踪跳转目标,找到重复出现的 URL 组合(如
/admin⇄/login) - 再切换到 Application → Clear storage 清除 Cookie 后重试,确认是否由会话状态异常引发



















