ThinkPHP 6.0 识别 HTTPS 请求的核心是通过路由层 ->https() 强制匹配或请求对象 isHttps() 方法判断,底层检测 $_SERVER['HTTPS'] 或 X-Forwarded-Proto 头,反向代理需配置 trusted_proxy 和 trusted_headers。

ThinkPHP 6.0 识别 HTTPS 请求,核心是通过路由参数或请求对象判断当前连接是否走 HTTPS 协议,不是配置 SSL 证书本身(那是 Web 服务器如 Nginx/Apache 的职责),而是让框架能准确感知并据此做逻辑控制。
路由层强制 HTTPS 匹配
在定义路由时使用 https() 方法,表示该路由仅在 HTTPS 请求下生效。任何 HTTP 请求访问都会跳过此路由,继续匹配后续规则:
// 只允许 HTTPS 访问的新闻详情页
Route::get('news/:id', 'News/read')->https();
// 同时要求 HTTPS + HTML 后缀
Route::get('article/:id', 'Article/show')->https()->ext('html');
// 批量设置:支持数组方式
Route::post('api/login', 'Api/Login/login')
->option(['https' => true, 'ajax' => true]);⚠️ 注意:只要任一参数不满足(比如 HTTP 请求却用了
->https()),该路由就完全不匹配,不会进入控制器,也不会报错——这是静默跳过,需结合日志或 fallback 路由排查。
请求对象中判断 HTTPS 状态
在控制器、中间件或任意业务逻辑中,可随时用 Request 类检测:
立即学习“PHP免费学习笔记(深入)”;
use think\Request;
$request = Request::instance();
if ($request->isSsl()) {
// 当前是 HTTPS 请求
}
// 或简写
if ($request->isHttps()) {
// 同上,isSsl() 和 isHttps() 效果一致
}底层原理是检查 $_SERVER['HTTPS'] === 'on' 或 $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'(适用于反向代理场景)。
反向代理环境需额外配置
如果项目部署在 Nginx/SLB 后,且 HTTPS 终止在网关层(即 PHP 接收到的是 HTTP 请求),则 isHttps() 默认会返回 false。此时需在 app.php 配置中启用信任代理头:
// config/app.php
'strict_route' => false,
'trusted_proxy' => ['127.0.0.1', '10.0.0.0/8'], // 允许的代理 IP 段
'trusted_headers' => [
\think\Request::HEADER_X_FORWARDED_PROTO => 'https',
],这样 isHttps() 就会读取 X-Forwarded-Proto: https 头来判断真实协议。
实际建议组合用法
-
敏感接口(如登录、支付):路由加
->https(),从入口杜绝非加密访问; -
全站强制 HTTPS:不在每个路由写
->https(),而是在全局中间件中重定向(需注意循环跳转); -
前端适配提示:在模板中用
Request::instance()->isHttps()控制 CDN 资源协议或埋点标识。
不需要改 .env 或数据库配置,也不依赖扩展包——这是框架原生支持的能力。



















