thinkphp 6 默认不信任反向代理协议头,故 $request->isssl() 总返回 false;需在 config/app.php 中设 'trust_proxy' => true 并配置可信代理段,同时 nginx/apache 透传 x-forwarded-proto 头方可正确识别 https。

ThinkPHP 6 本身不提供“一键开启 HTTPS”的配置项,HTTPS 安全性必须由 Web 服务器(Nginx/Apache)和应用层协同保障;只改框架配置或只配证书,都会漏掉关键环节,导致 Cookie 失效、跳转错乱、混合内容警告甚至登录态丢失。
为什么 $request->isSsl() 总返回 false
因为 TP6 默认不信任反向代理传来的协议头。你在 Nginx 或 CDN 后面时,原始 HTTPS 请求被终止,后端 PHP 收到的是 HTTP 请求,$_SERVER['HTTPS'] 根本不存在或为空——这不是 TP6 的 bug,是设计使然。
- 必须在
config/app.php中显式启用代理信任:'trust_proxy' => true,并填入可信代理 IP 段(如['127.0.0.1', '10.0.0.0/8']) - Nginx 配置中要透传协议头:
proxy_set_header X-Forwarded-Proto $scheme; - Apache 需启用
mod_headers并加:RequestHeader set X-Forwarded-Proto "https" env=HTTPS - 验证是否生效:在控制器里打印
$request->header('x-forwarded-proto'),上线前务必确认它能读到https
强制跳转 HTTPS 的中间件写法(推荐)
比 Nginx return 301 更可控,尤其适合多层 CDN、SLB 或测试环境无法改服务器配置的场景。但不能无差别跳转,否则 CLI 命令会崩、API 接口会中断。
- 在
app/middleware.php全局中间件数组最前面注册闭包或类中间件 - 先排除非 Web 场景:
if (PHP_SAPI === 'cli') return $next($request); - 再判断是否需跳转:
if (!$request->isSsl() && $request->header('x-forwarded-proto') !== 'https') - 用
$request->url(true)构造完整 URL(含 query、fragment),别拼$_SERVER—— 它在容器或代理后极不可靠 - 返回
redirect()->to('https://' . $request->host() . $request->url(true))->code(301)
Cookie 和 Session 必须手动设 secure => true
即使全站已走 HTTPS,TP6 默认生成的 Cookie 仍不带 Secure 标志。浏览器会在 HTTPS 页面发起请求时,拒绝发送这些 Cookie,直接导致登录态丢失、CSRF token 不匹配、AJAX 请求 401。
- 修改
config/cookie.php:'secure' => true、'httponly' => true、'samesite' => 'Lax' - 同步改
config/session.php,同样设'secure' => true和'samesite' => 'Lax' - 若项目部署在子目录(如
/admin/),还需补上'path' => '/admin/',否则 Cookie 不下发 - 检查模板中所有硬编码的
http://资源链接,包括 JS/CSS、图片、iframe、数据库字段里的 URL,否则触发混合内容警告
本地开发与线上环境的差异点
本地用 Valet、XAMPP 或 php think run 时,$request->isSsl() 天然为 false,中间件跳转会无限重定向。这不是配置错误,而是环境本质不同。
- 开发环境建议关闭强制跳转中间件,或加白名单判断:
if (env('APP_ENV') === 'production') - 宝塔面板申请 Let's Encrypt 证书后,记得勾选「强制 HTTPS」——它会自动写 Nginx 的
return 301,此时 PHP 层跳转可完全移除 - Cloudflare 用户注意:开启「Always Use HTTPS」后,仍需在 TP6 中配置
trust_proxies,否则isSsl()仍判不准,Session 会反复重建 - 容器部署时,确保
TRUSTED_PROXIES环境变量或配置项覆盖了宿主机网段(如172.16.0.0/12),否则代理头被丢弃
最常被忽略的其实是 Cookie 的 secure 属性和反向代理头的信任链,这两处一漏,HTTPS 就形同虚设——页面有小绿锁,但用户密码、登录态、CSRF token 全在裸奔。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











