全站https重定向必须由nginx/apache在80端口server块中用return 301实现,同时配置app_url、asset_url为https并正确设置trustproxies中间件,forcehttps仅作兜底。

全站 HTTPS 重定向不能只靠 Laravel 应用层做,必须由 Web 服务器(Nginx/Apache)在请求进入 PHP 前就完成 301 跳转;否则敏感数据已明文传输、SEO 受损、混合内容无法避免,且中间件对静态资源、API 预检、CLI 命令完全无效。
Nginx 必须配置独立的 80 端口 server 块 return 301
这是唯一能覆盖所有请求类型(HTML、JS、CSS、API、OPTIONS 预检、robots.txt)的方案。rewrite 指令有性能开销且易出错,return 更直接安全。
-
server块必须监听80,且server_name与 HTTPS 块严格一致,避免多域名跳转错乱 - 使用
return 301 https://$server_name$request_uri;——$server_name保留原始 Host,$request_uri完整携带路径和查询参数 - 不要在 HTTPS 的
443server 块里加 if ($scheme = http) { ... },Nginx 不允许在非 80 块内判断 scheme - 若用 Cloudflare 或 AWS ALB,确保它们终止 SSL 后,向 Nginx 透传
X-Forwarded-Proto: https头(默认通常已开启)
APP_URL 和 ASSET_URL 必须设为 https://
这两个环境变量决定 url()、route()、asset() 等辅助函数生成链接的基础协议。设成 http:// 会导致前端加载 CSS/JS 时触发浏览器“混合内容”拦截,页面白屏或功能异常。
- 修改
.env:确保APP_URL=https://yourdomain.com,ASSET_URL=https://yourdomain.com - 运行
php artisan config:clear清除配置缓存,否则旧值仍生效 - 本地开发时建议用不同 env(如
.env.local),避免误将本地设为 https 导致调试失败
TrustProxies 中间件必须正确配置可信代理 IP 和头字段
Laravel 默认不信任任何代理头,即使 Nginx 已传 X-Forwarded-Proto,$request->secure() 仍返回 false,url() 也继续拼 http。
- 编辑
app/Http/Middleware/TrustProxies.php,设置protected $proxies为实际代理 IP(如['127.0.0.1', '10.0.0.0/8']),别用'*'(生产环境不安全且可能破坏Request::ip()) - 确认
protected $headers包含Request::HEADER_X_FORWARDED_PROTO(Laravel 9+ 默认已含,但老版本需手动补) - 如果部署在 Forge + Nginx,通常只需填
['127.0.0.1'];AWS EC2 + ALB 则填 ALB 所在子网段(如'10.0.0.0/16') - 配完后测试:
dd(request()->secure());应返回true,url('/test')输出应为https://...
ForceHttps 中间件只能作兜底,且必须加环境判断
仅当无法修改 Web 服务器配置(如某些共享主机)时才启用。它无法解决混合内容,且对 public/ 下静态文件、artisan 命令、队列任务等完全无效。
- 新建中间件:
php artisan make:middleware ForceHttps - handle 方法中必须包含
app()->environment('production')条件,否则本地开发会无限跳转 - 用
redirect()->to($request->fullUrl())->secure(),而非硬编码https://—— 它自动替换协议并保留 query、fragment - 把它加到
app/Http/Kernel.php的$middleware数组最顶部,确保早于所有其他中间件执行
最容易被忽略的是:Web 服务器没配 301 跳转,只改 Laravel 配置,等于给 HTTPS 戴了顶帽子,身体还在 HTTP 里跑——Cookie 的 Secure 属性可能失效,CSRF token 可能被截获,浏览器控制台持续报 Mixed Content。真正的 HTTPS 全站强制,是服务器层、代理层、应用层三者协同的结果,缺一不可。











