Laravel站点支持HTTPS需先在Nginx/Apache配置SSL证书并监听443端口,再通过APP_URL设为https、TrustProxies中间件信任X-Forwarded-Proto头识别HTTPS状态,否则将出现混载HTTP资源、链接仍为http://、跳转失效或502错误。

让Laravel站点支持HTTPS不是改几个PHP配置就能生效的事,必须先在Nginx或Apache上正确加载SSL证书并监听443端口,再让Laravel识别代理传来的HTTPS状态,否则页面会混载HTTP资源、链接仍是http://开头、跳转失效甚至直接502。
获取并安装Let’s Encrypt免费证书
用Certbot一键申请并部署证书,比手动上传更可靠,还能自动续期。
执行命令:sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com。Certbot会自动检测Nginx配置、申请证书、修改server块并重载服务。
如果提示“Could not find a VirtualHost matching domain”,说明Nginx配置里缺少对应server_name yourdomain.com的块,需先补全再运行。
证书默认存放在/etc/letsencrypt/live/yourdomain.com/下,包含fullchain.pem和privkey.pem两个关键文件——【别用cert.pem代替fullchain.pem,否则浏览器提示证书不完整】。
Nginx配置HTTPS并强制跳转
Certbot通常已为你生成HTTPS server块,但需人工确认三处是否正确:
① listen 443 ssl; 必须存在,且不能写成listen 443;(缺ssl会导致纯HTTP监听);
② ssl_certificate 路径必须指向/etc/letsencrypt/live/yourdomain.com/fullchain.pem;
③ ssl_certificate_key 路径必须指向/etc/letsencrypt/live/yourdomain.com/privkey.pem;
在同一个配置文件中,新增一个仅监听80端口的server块,内容为:return 301 https://$host$request_uri;。这比rewrite更高效,所有HTTP请求在抵达PHP前就被重定向。
执行sudo nginx -t && sudo systemctl reload nginx验证并生效。若报错SSL_CTX_use_PrivateKey_file failed,运行sudo chmod 600 /etc/letsencrypt/live/yourdomain.com/privkey.pem修复私钥权限。
Laravel应用层适配HTTPS
方法一:环境变量与中间件配合(推荐)
编辑.env文件,将APP_URL=http://yourdomain.com改为APP_URL=https://yourdomain.com;
打开app/Http/Middleware/TrustProxies.php,设置:protected $proxies = '*';protected $headers = Request::HEADER_X_FORWARDED_PROTO;
这一步最关键:Nginx默认会添加X-Forwarded-Proto: https头,但Laravel默认不信任该头,不设$headers就永远识别不了HTTPS请求。
方法二:强制URL Scheme(兜底用)
在app/Providers/AppServiceProvider.php的boot()方法中加入:\URL::forceScheme('https');
仅当反向代理链路复杂(如经过CDN+负载均衡+多级Nginx)导致X-Forwarded-Proto丢失时才启用,日常单层Nginx无需此步。
最后清空配置缓存:php artisan config:clear。不执行这步,.env修改和中间件设置都不会生效。


















