ThinkPHP 7.1本身不处理HTTPS,SSL证书必须由Nginx/Apache加载终止;需配置443端口证书路径、80端口301跳转,并在ThinkPHP中设置secure cookie、HTTPS识别参数及全站资源协议一致。

ThinkPHP 7.1 本身不安装也不处理 HTTPS 证书——证书必须由 Nginx 或 Apache 加载终止,框架只接收解密后的请求。你改 config/app.php 或写几行 PHP 是起不了作用的。
Nginx 配置 443 端口并加载证书
这是真正启用 HTTPS 的第一步,也是唯一需要“安装证书”的环节:
-
ssl_certificate必须指向完整的证书链文件(如/etc/letsencrypt/live/yourdomain.com/fullchain.pem),不能只用cert.pem,否则 iOS 和部分安卓设备会提示不信任 -
ssl_certificate_key指向私钥,权限必须是600:chmod 600 /etc/letsencrypt/live/yourdomain.com/privkey.pem - 务必确认 Nginx 编译时启用了 SSL 模块:
nginx -V 2>&1 | grep -o with-http_ssl_module,没输出就得重装 -
root要明确指向 ThinkPHP 的public/目录,例如root /var/www/myapp/public;,否则静态资源 404
80 端口必须单独配 return 301 跳转
别在同一个 server 块里用 if ($scheme = http) 或 rewrite,它们有性能和逻辑陷阱:
- 跳转规则必须放在独立的
server { listen 80; }块中,且该块要写在 443 块之前 - 用
return 301 https://$host$request_uri;,不是https://$server_name—— 后者不支持多域名 - 浏览器缓存 301 后不会反复请求 HTTP,但本地测试时可用
curl -I http://yourdomain.com验证状态码是否为 301
ThinkPHP 7.1 需手动适配 HTTPS 上下文
框架默认不信任反向代理传来的 HTTPS 状态,容易导致生成的 URL 是 http://、Cookie 无法携带 Secure 标志:
立即学习“PHP免费学习笔记(深入)”;
- 确保 Nginx 的 PHP fastcgi 块里加了这一行:
fastcgi_param HTTPS on;(如果走反向代理,还要加fastcgi_param HTTP_X_FORWARDED_PROTO https;) - 检查
$_SERVER['HTTPS']是否为"on"或1,不是就说明上一步漏了 - 在
config/session.php中设'secure' => true,否则登录态在 HTTPS 下可能被浏览器拒绝发送 - 避免在代码里硬编码
http://,URL 构建统一用Url::build()或url()辅助函数
最容易被忽略的是:混合内容(http:// 加载的 JS/CSS/图片)会让浏览器直接屏蔽资源或降级显示“不安全”,哪怕证书配置全对。上线前一定要用 Chrome DevTools 的 Console 和 Security 标签页扫一遍。证书本身只是起点,后续每层透传和适配断一环,HTTPS 就算“装上了”也等于没开。



















