ThinkPHP本身不处理HTTPS,真正起作用的是Web服务器(Nginx/Apache)的SSL配置;框架只需正确识别协议、生成安全链接、保障Cookie传输安全——这三件事做对,HTTPS才算真正开启。

ThinkPHP本身不直接处理HTTPS,真正起作用的是Web服务器(Nginx或Apache)的SSL配置。框架只需正确识别协议、生成安全链接、保障Cookie传输安全——这三件事做对了,HTTPS才算真正“开启”。
一、在Nginx上配置SSL证书与强制跳转
这是最推荐、最稳定的方式,所有跳转由服务器完成,不经过PHP解析,效率高且无循环风险。
- 确保已获取有效证书(如Let’s Encrypt),并将
.crt和.key文件放在Nginx可读路径(如/etc/letsencrypt/live/yourdomain.com/) - 编辑站点配置文件,在80端口server块中添加:
return 301 https://$host$request_uri; - 在443端口server块中启用SSL:
listen 443 ssl http2;ssl_certificate /path/to/fullchain.pem;ssl_certificate_key /path/to/privkey.pem; - 务必设置
root指向ThinkPHP的public目录,并保留PATHINFO重写规则(如try_files $uri $uri/ /index.php?$query_string;) - 执行
nginx -t && systemctl reload nginx生效
二、让ThinkPHP正确识别HTTPS协议
很多跳转失败或URL仍是http,根源在于框架收不到真实协议头——尤其在Nginx + PHP-FPM或有CDN/SLB时。
- 在Nginx的fastcgi配置段中加入:
fastcgi_param HTTP_X_FORWARDED_PROTO $scheme; - 在
config/app.php中启用代理信任:'trust_proxy' => true,
或更安全地指定白名单:'trust_proxies' => ['127.0.0.1', '10.0.0.0/8'] - 在
app/middleware.php开头注册:think\middleware\TrustProxy::class - 验证是否生效:在控制器中打印
$request->isSsl(),应返回true(HTTPS下)
三、修复混合内容与安全输出
即使页面能打开HTTPS,浏览器仍可能报“不安全”,原因常是资源链接含硬编码http。
立即学习“PHP免费学习笔记(深入)”;
- 在
.env中明确设置:APP_URL=https://yourdomain.comURL_HTTPS=true - 模板中调用URL时加第三个参数强制HTTPS:
{:url('index/index', [], true)} - 检查数据库、富文本、静态资源链接,批量替换
http://为//或https:// - 在
config/cookie.php中设:'secure' => true,'samesite' => 'Lax',
否则登录态可能丢失
四、宝塔面板用户快速启用HTTPS
如果你用宝塔,大部分步骤可图形化完成,但仍有几个关键点不能跳过。
- 确认域名已正确解析到服务器IP,且443端口已在安全组和防火墙放行
- 进入「网站」→「设置」→「SSL」→「Let’s Encrypt」申请证书(支持泛域名)
- 勾选「强制HTTPS」,它会自动添加Nginx 301规则
- 手动检查Nginx配置是否包含
fastcgi_param HTTP_X_FORWARDED_PROTO $scheme;(宝塔默认可能缺失) - 修改
.env补充APP_URL,避免后台生成HTTP链接
不复杂但容易忽略。核心就三点:服务器配好证书并跳转、框架信得过代理头、链接和Cookie都走安全通道。



















