如何设置ThinkPHP强制HTTPS跳转及SSL证书部署并实现301重定向?
- 内容介绍
- 文章标签
- 相关推荐
本文共计910个文字,预计阅读时间需要4分钟。
ThinkPHP 本身不处理 HTTPS 和强制跳转,所有全站 301 跳转 HTTPS必须由 Web 服务器(Nginx/Apache)完成;在 PHP 层硬编码 +3C header('Location: https://...')+ 容易触发 +3C ERR_TOO_MANY_REDIRECTS+、内容混合或 CLI 报错,且无法绕过 CDN/SLB 的协议头清洗问题。
为什么不能只靠 $_SERVER['HTTPS'] === 'on' 判断
这个值在绝大多数生产环境(Nginx + PHP-FPM、阿里云 SLB、Cloudflare、Docker)下为空或 off,因为反向代理默认不设置它。TP6 的 $request->isSsl() 底层也依赖这个变量,不补全代理头就永远不准。
- 真实可信的判断依据是
$_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https',这是代理普遍透传的标准字段 - 若用阿里云/腾讯云负载均衡,需确认已开启「传递客户端真实协议」选项
- CDN(如 Cloudflare)可能清洗掉该 header,需在 CDN 控制台检查或启用「Preserve original host header」类选项
Nginx 配置 301 跳转(推荐首选)
这是最安全、无性能损耗、且与框架完全解耦的方式。不要在 index.php 或中间件里写跳转逻辑。
本文共计910个文字,预计阅读时间需要4分钟。
ThinkPHP 本身不处理 HTTPS 和强制跳转,所有全站 301 跳转 HTTPS必须由 Web 服务器(Nginx/Apache)完成;在 PHP 层硬编码 +3C header('Location: https://...')+ 容易触发 +3C ERR_TOO_MANY_REDIRECTS+、内容混合或 CLI 报错,且无法绕过 CDN/SLB 的协议头清洗问题。
为什么不能只靠 $_SERVER['HTTPS'] === 'on' 判断
这个值在绝大多数生产环境(Nginx + PHP-FPM、阿里云 SLB、Cloudflare、Docker)下为空或 off,因为反向代理默认不设置它。TP6 的 $request->isSsl() 底层也依赖这个变量,不补全代理头就永远不准。
- 真实可信的判断依据是
$_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https',这是代理普遍透传的标准字段 - 若用阿里云/腾讯云负载均衡,需确认已开启「传递客户端真实协议」选项
- CDN(如 Cloudflare)可能清洗掉该 header,需在 CDN 控制台检查或启用「Preserve original host header」类选项
Nginx 配置 301 跳转(推荐首选)
这是最安全、无性能损耗、且与框架完全解耦的方式。不要在 index.php 或中间件里写跳转逻辑。

