应优先使用nginx服务器层301重定向,因其在请求到达php前完成跳转,性能最高、最安全且与框架解耦;其次可选apache .htaccess规则、thinkphp trustproxy+自定义中间件、cdn页面规则,php入口文件跳转仅作临时兜底。

如果您在ThinkPHP项目中启用HTTPS后,用户仍可通过HTTP访问网站,则存在混合内容、Cookie泄露及中间人攻击风险。以下是实现HTTPS强制跳转的多种可靠配置方式:
一、Nginx服务器层301重定向
该方式在请求到达PHP应用前完成跳转,性能最高、最安全,且完全解耦于框架逻辑,避免因中间件执行顺序或代理头缺失导致的失效。
1、打开站点对应的Nginx配置文件(如 /etc/nginx/conf.d/your-site.conf 或 vhost/yourdomain.com.conf)。
2、确认存在一个仅监听80端口的 server 块,并在其内添加以下指令:
3、return 301 https://$host$request_uri;
4、确保该 server 块中未包含 root 或 index 等可能触发PHP解析的指令,仅保留跳转逻辑。
5、执行 nginx -t 验证语法,再运行 systemctl reload nginx 生效。
二、Apache通过.htaccess启用Rewrite规则
适用于使用Apache且具备Rewrite模块权限的环境,无需修改虚拟主机配置,由目录级规则统一控制。
1、进入ThinkPHP项目的根目录(即包含 public/ 的上级目录)。
2、创建或编辑 .htaccess 文件。
3、写入以下三行规则:
4、RewriteEngine On
5、RewriteCond %{HTTPS} off
6、RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
7、确认Apache已启用 mod_rewrite 模块,并在虚拟主机配置中设置 AllowOverride All。
三、ThinkPHP自定义中间件实现可控跳转
该方式适用于无法修改服务器配置的受限环境(如部分共享主机),但必须配合代理头信任机制,否则在CDN、SLB或Nginx反代后将始终误判为HTTP。
1、在 app/middleware.php 全局中间件数组中,**首位**注册 think\middleware\TrustProxy::class。
2、在 config/app.php 中启用代理信任并指定可信IP段:
3、'trust_proxy' => true,
4、'trust_proxies' => ['127.0.0.1', '10.0.0.0/8', '172.16.0.0/12'],
5、创建中间件类 app/middleware/ForceHttpsMiddleware.php,内容如下:
6、public function handle($request, \Closure $next)
7、{
8、if (!$request->isSsl() && !in_array($request->method(), ['CLI', 'OPTIONS']) && !$request->isAjax()) {
9、return redirect()->to('https://' . $request->host() . $request->url(true));
10、}
11、return $next($request);
12、}
四、CDN平台页面规则强制HTTPS
当网站已接入Cloudflare、阿里云CDN或腾讯云CDN时,可直接利用其控制台功能实现全链路HTTPS保障,无需改动源站代码或配置,且能规避源站跳转与CDN跳转叠加引发的ERR_TOO_MANY_REDIRECTS错误。
1、登录对应CDN服务商控制台,定位至目标域名管理页。
2、进入 规则引擎 或 页面规则 模块。
3、新建规则,匹配URL模式设为:http://*yourdomain.com/*(通配符覆盖所有子路径)。
4、操作类型选择:始终使用 HTTPS 或等效选项(如Cloudflare为“Always Use HTTPS”)。
5、保存规则并等待全球节点同步生效(通常1–5分钟)。
五、入口文件PHP代码兜底跳转
该方式仅作为极端情况下的临时补救措施(如测试环境无权限配置服务器),严禁用于生产环境,因其无法处理POST请求重定向、易引发重复提交,且绕过中间件信任链校验。
1、打开 public/index.php 文件。
2、在 标签后立即插入以下代码段(必须位于所有框架初始化之前):
3、if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
4、if ($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '' !== 'https') {
5、$redirect_url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
6、header('HTTP/1.1 301 Moved Permanently');
7、header('Location: ' . $redirect_url);
8、exit();
9、}
10、}
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











