应优先在Nginx或Apache服务器层配置301重定向,最安全高效;若需应用层控制,须先启用TrustProxy中间件并校验X-Forwarded-Proto,再结合白名单过滤跳转,避免循环与误判。

如果您在使用ThinkPHP时希望用户访问HTTP地址时自动跳转至HTTPS安全连接,但跳转未生效或出现重定向循环,则可能是由于跳转逻辑部署位置不当、代理头未正确识别或服务器配置冲突所致。以下是解决此问题的步骤:
一、在Nginx服务器层配置301重定向
该方式最高效、最可靠,完全绕过PHP解析,避免中间件执行开销与代理头误判风险,且不依赖框架代码改动。
1、编辑站点对应的Nginx配置文件(如 /etc/nginx/sites-available/your-site.conf)。
2、确保存在一个监听80端口的server块,并在其内添加以下指令:
立即学习“PHP免费学习笔记(深入)”;
3、return 301 https://$host$request_uri;
4、确认该server块中 server_name 已正确设置为您的域名(如 example.com www.example.com)。
5、执行 sudo nginx -t 验证语法,再运行 sudo systemctl reload nginx 生效配置。
二、在Apache服务器层启用Rewrite规则
适用于使用Apache作为Web服务器的环境,通过.htaccess或虚拟主机配置实现协议跳转,无需修改应用代码。
1、进入网站根目录,确认已启用 mod_rewrite 模块。
2、打开或新建 .htaccess 文件。
3、插入以下两行规则:
4、RewriteCond %{HTTPS} off
5、RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
6、保存文件后,确保Apache配置中允许 .htaccess 覆盖规则(AllowOverride All)。
三、在ThinkPHP中间件中安全判断并跳转
该方法适用于需精细控制跳转范围(如排除CLI、AJAX、本地调试)的场景,但必须前置启用TrustProxy中间件以确保协议识别准确。
1、在 config/app.php 中设置:'trust_proxy' => true,并按实际填写 'trust_proxies' 白名单(如 ['127.0.0.1', '10.0.0.0/8'])。
2、在 app/middleware.php 全局中间件数组开头注册 think\middleware\TrustProxy::class。
3、创建自定义中间件 app/middleware/ForceHttpsMiddleware.php,其 handle() 方法中加入判断逻辑:
4、检查 $request->isSsl() 是否为 false,且非CLI、非AJAX请求、非本地开发(!$request->isAjax() && PHP_SAPI !== 'cli' && $request->host() !== 'localhost')。
5、满足条件时,调用 $response->redirect($request->url(true), 301) 发起跳转。
四、在入口文件public/index.php中补全HTTPS标识
用于修复反向代理(如Nginx + PHP-FPM、CDN、SLB)环境下 $_SERVER['HTTPS'] 不可用的问题,为后续所有逻辑提供可信协议依据。
1、打开 public/index.php 文件。
2、在 标签后的第一行插入以下代码:
3、if ($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '' === 'https') { $_SERVER['HTTPS'] = 'on'; }
4、确保该语句位于任何框架初始化或请求对象创建之前。
五、禁用CDN层重复跳转功能
当站点接入Cloudflare、阿里云CDN或腾讯云CDN时,若同时开启CDN侧“强制HTTPS”与源站Nginx/中间件跳转,极易触发 ERR_TOO_MANY_REDIRECTS 错误。
1、登录对应CDN控制台(如Cloudflare → Rules → Page Rules)。
2、查找已启用的“Always Use HTTPS”类规则。
3、临时禁用该规则 或将其匹配路径限定为特定子路径(非全站通配)。
4、仅保留源站Web服务器(Nginx/Apache)或ThinkPHP中间件中的一处跳转逻辑生效。



















