本质是伪静态配置与PATH_INFO传递失配导致请求反复重写,需确保location /规则在location ~ .php$之前、用last而非break、补全fastcgi_split_path_info和PATH_INFO参数,并禁用use_trans_sid及HTTPS中间件误判。

ThinkPHP6 路由重定向循环(rewrite or internal redirection cycle 或浏览器报 ERR_TOO_MANY_REDIRECTS)本质是请求在 Web 服务器和框架之间被反复转发,没走到终点。问题通常不出在路由定义本身,而在于伪静态配置、PATH_INFO 传递、session 设置或 HTTPS 中间件这几处关键环节的协同失配。
检查 Nginx 的重写规则是否触发死循环
phpEnv、部分老旧 Nginx 或自定义配置中,若同时存在多个重写逻辑,极易形成循环:
- 确认只有一处
location /+if (!-e $request_filename)规则,且它必须放在location ~ \.php$块之前 - 禁用
try_files $uri $uri/ /index.php?$query_string和if规则混用——phpEnv 不兼容这种组合,会反复跳回/index.php再匹配自身 - 重写语句末尾必须用
last,不能用break或redirect;last才能触发重新匹配 location,让请求真正落到 PHP 处理块 - 如果用了
url_html_suffix(如.html),确保 Nginx 没对.html后缀做额外 rewrite 或 try_files 干预
排查 session.use_trans_sid 引发的 URL 叠加
开启 'use_trans_sid' => true 后,TP6 会在所有 url() 和 redirect() 生成的链接里自动追加 PHPSESSID=xxx。若中间件或反向代理又做了路径重写,这个参数可能被重复拼接,导致 URL 越来越长,最终触发浏览器重定向上限。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 检查
config/session.php,确认'use_trans_sid' => false(默认就是 false,除非你手动改过) - 搜索项目中是否有中间件对 URL 做了二次 rewrite,尤其是匹配
PHPSESSID=或sid=的规则 - 部署在 Cloudflare、SLB 后时,确认它们没有开启“自动会话保持”类功能并往 URL 注入参数
验证 HTTPS 强制跳转中间件是否误判
未正确配置代理信任时,$request->isSsl() 永远返回 false,导致中间件不断把 HTTPS 请求当成 HTTP 重定向,形成闭环。
立即学习“PHP免费学习笔记(深入)”;
- 在中间件里加调试:输出
$request->header('x-forwarded-proto')和$request->isSsl(),确认协议识别是否准确 - 确保
config/app.php中已设置'trust_proxy' => true,且'trust_proxies'包含你实际的 SLB/CDN 回源 IP 段(如['10.0.0.0/8']) - API 接口、AJAX 请求、CLI 命令必须跳过重定向逻辑,否则
redirect()在无响应上下文时可能静默失败或干扰流程
确认 PATH_INFO 是否被正确剥离和传递
伪静态重写后,若 Nginx 没把真实路径信息传给 PHP,TP6 就无法解析路由,可能退回到入口文件逻辑,再被重写规则捕获,造成循环。
- 在
location ~ \.php$块内,检查是否包含fastcgi_split_path_info ^(.+?\.php)(/.*)$;和fastcgi_param PATH_INFO $fastcgi_path_info; - phpEnv 等精简环境常缺失这两行,需手动补全;否则
$_SERVER['PATH_INFO']为空,/user/list会被当作静态资源处理,触发if (!-e ...)再次重写 - 若使用 Apache,确认
.htaccess中的RewriteRule使用了[QSA,PT,L]标志,PT(pass-through)才能让 PATH_INFO 正确透传


















