根本原因是ThinkPHP默认不信任反向代理传来的HTTPS头,url()等函数强制生成HTTP链接,与Nginx强制跳转HTTPS形成死循环;需配置trust_proxy、trust_headers及Cookie secure选项。

ThinkPHP 为什么在 HTTPS 下跳转死循环
根本原因是 think\facade\Request 默认不信任反向代理传来的 HTTPS 头,仍认为当前是 HTTP 请求,于是 url()、redirect() 等生成的链接强制走 http://,浏览器重定向后又被服务器(如 Nginx)强制跳回 HTTPS,形成闭环。
常见现象:访问 https://example.com/admin,地址栏反复闪现 http:// → https:// → http://,F12 Network 中看到 302 响应不断叠加。
- 确认是否用了 Nginx/Apache 反向代理(尤其宝塔、Docker、云厂商负载均衡),且未透传
X-Forwarded-Proto或X-Forwarded-Scheme - 检查
$_SERVER['HTTPS']是否为off或空 —— 这是 ThinkPHP 判断协议的默认依据 - 别直接改框架源码判断逻辑,ThinkPHP 提供了标准入口干预点
如何让 Request 正确识别 HTTPS 协议
ThinkPHP 6+ 的 think\facade\Request 支持通过配置指定可信代理和协议头,而不是硬依赖 $_SERVER['HTTPS']。
在 config/app.php 中添加或修改:
'trust_proxy' => true,
'trust_servers' => ['127.0.0.1', '172.16.0.0/12', '192.168.0.0/16'],
'trust_headers' => [
\think\Request::HEADER_X_FORWARDED_PROTO => 'https',
\think\Request::HEADER_X_FORWARDED_SCHEME => 'https',
],
-
trust_proxy必须设为true,否则所有代理头都被忽略 -
trust_servers要严格匹配你的真实代理 IP 段(比如 Docker 宿主机常是172.17.0.1),写错会导致安全绕过或协议识别失效 - 如果 Nginx 配置了
proxy_set_header X-Forwarded-Proto $scheme;,就用HEADER_X_FORWARDED_PROTO;部分云 WAF 用X-Forwarded-Scheme,两个都配更稳妥
Cookie 的 Secure 和 HttpOnly 怎么设才不丢登录态
HTTPS 环境下若 Cookie 缺少 Secure 标志,浏览器不会在 HTTPS 请求中携带它 —— 表现为“明明登录了,刷新一下就 401”。
ThinkPHP 的 Session 和 Cookie 组件默认不自动开启 Secure,需手动配置:
// config/session.php 'secure' => true, 'http_only' => true, 'same_site' => 'Strict',
// config/cookie.php 'secure' => true, 'http_only' => true, 'same_site' => 'Lax',
-
secure => true是必须项,否则 Cookie 不会随 HTTPS 请求发送 -
same_site设为Strict可能导致跨站跳转后丢失 Session(比如从微信内页进站),生产环境建议用Lax - 如果用了自定义 Cookie 名(如
think_token),记得在中间件或登录逻辑里显式调用cookie('think_token', $val, ['secure' => true])
调试时怎么快速验证协议和 Cookie 是否生效
别只看浏览器地址栏,重点查三处:
- 打开开发者工具 → Application → Cookies,确认每个 Cookie 的
Secure列显示为 ✅,且Domain匹配当前域名(注意带不带 www) - 在控制器里加一行:
dump(request()->isSsl(), request()->scheme(), cookie());,看输出是否为true, 'https', [...] - 用
curl -I https://yoursite.com查响应头,确认Set-Cookie含有Secure和HttpOnly字样
最容易被忽略的是:Nginx 的 proxy_set_header Host $host; 如果没加,ThinkPHP 可能误判当前域名,导致 URL 生成异常,连带影响 Cookie 的 Domain 设置。这个细节不报错,但会让整个 HTTPS 适配前功尽弃。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











