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

ThinkPHP 本身不直接处理 HTTPS 协议,SSL 证书必须由 Web 服务器(如 Nginx 或 Apache)加载并终止加密连接。框架只负责接收已解密的请求。所以“部署 SSL 证书”本质是 Web 服务器配置 + ThinkPHP 环境适配,不是改几行 PHP 代码就能生效。
下面分三块说清楚:Nginx 配置 HTTPS、强制跳转、ThinkPHP 层适配要点,全是生产环境验证过的做法。
Nginx 正确加载 SSL 证书
证书路径必须绝对、文件可读、模块已启用: - 把 `.crt`(含完整链)和 `.key` 文件放到安全目录,比如 `/etc/nginx/ssl/yourdomain.com.pem` 和 `/etc/nginx/ssl/yourdomain.com.key` - 运行 `nginx -V 2>&1 | grep -o with-http_ssl_module` 确认支持 SSL;没输出就得重编译加 `--with-http_ssl_module` - 在 `server { listen 443 ssl; }` 块里写明证书路径: ```nginx ssl_certificate /etc/nginx/ssl/yourdomain.com.pem; ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key; ``` - 别漏了 `root` 指向 ThinkPHP 的 `public/` 目录,例如 `root /var/www/your-app/public;` - 加上基础安全项:`ssl_protocols TLSv1.2 TLSv1.3;`、`ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...;`HTTP 全站 301 跳转到 HTTPS
这个规则必须独立写在另一个 `server { listen 80; }` 块里,且放在 HTTPS 块之前: ```nginx server { listen 80; server_name yourdomain.com www.yourdomain.com; return 301 https://$host$request_uri; } ``` - 不要用 `rewrite`,`return 301` 更快更可靠 - `$host` 保留原始域名(支持多域名),`$request_uri` 完整保留路径和参数 - 浏览器缓存 301 后不会反复跳,SEO 友好ThinkPHP 层需检查的几件事
框架不参与证书加载,但要避免 HTTPS 下出问题: - 确保 `public/index.php` 是唯一入口,Nginx 的 `location ~ \.php$` 正确转发到它 - 检查 `config/app.php` 中 `'url' => 'https://yourdomain.com'`(如有硬编码 URL 场景) - 开启 secure cookie:在 `config/session.php` 中设 `'secure' => true`,否则登录态在 HTTPS 下可能失效 - 如果用 `Url::build()` 生成链接,确保 `$_SERVER['HTTPS']` 或 `$_SERVER['HTTP_X_FORWARDED_PROTO']` 被正确识别 —— Nginx 需加这一行: ```nginx fastcgi_param HTTPS on; ``` 或更通用的: ```nginx fastcgi_param HTTP_X_FORWARDED_PROTO $scheme; ``` - 所有静态资源(CSS/JS/图片)引用必须用相对路径或 `https://`,否则浏览器会拦截混合内容不复杂但容易忽略



















