ssl配置必须由nginx/apache完成,laravel仅处理应用逻辑;nginx需满足域名解析、证书路径正确且有读权限、443端口开放三条件;强制https跳转应在nginx用return 301实现;laravel需设app_url为https并视情况调用url::forcescheme('https')及启用session.secure。

SSL证书配置不在Laravel里做
Laravel本身不处理HTTPS终止,它只管应用逻辑;SSL必须由Web服务器(Nginx或Apache)完成。你往 .env 里写 APP_URL=https://example.com 没用,如果Nginx没配好TLS,浏览器根本连不到Laravel。
Nginx配置SSL的三个硬性条件
缺一不可,少一个都会出现 ERR_CONNECTION_REFUSED 或证书不受信任:
- 域名已正确解析到服务器IP(
ping example.com要通) -
ssl_certificate和ssl_certificate_key路径必须绝对且Nginx有读权限(常见坑:/etc/nginx/ssl/下文件属主是root,但Nginx worker是www-data) - 443端口在防火墙(
ufw或云厂商安全组)中开放
最小可用配置片段(别照抄,路径和域名要换):
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
root /var/www/example/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
}
强制HTTPS跳转必须加在Nginx里
别在Laravel中间件里做301重定向,那是在应用层补漏,效率低还可能绕过;正确做法是Nginx直接返回301:
- HTTP server块里加
return 301 https://$host$request_uri; - 不能用
rewrite,它比return多一次匹配开销 - 如果用了Cloudflare等CDN,注意开启“Full (strict)”模式,并把源站Nginx的
ssl_certificate改成真实证书,别用自签
PHP和Laravel的小配合点
Web服务器配完SSL后,Laravel才需要微调,否则生成的URL还是http:
- 确保
APP_URL是https://example.com(不是http) - 在
AppServiceProvider::boot()中加\URL::forceScheme('https');—— 仅当Nginx没传X-Forwarded-Proto时才需要(比如反向代理链路复杂) - 检查
config/session.php的secure是否为true,否则Session Cookie不会带Secure标志,Chrome会拒绝发送
真正卡住人的地方往往不是配证书,而是Nginx没把 X-Forwarded-Proto: https 透传给PHP,导致Laravel以为自己跑在HTTP上。这个头必须显式设置:proxy_set_header X-Forwarded-Proto $scheme;。











