[踩了个坑] Laravel 访问https网址,url('/')竟然只返回 http?

最近在抄文档 laravel + breeze + vue 的码,部署如下:




// 开发环境


Https ---> 云服务器Nginx反向代理Http --->  vpn内网的本机Nginx ---> fpm ---> Laravel




// 生产环境


Https ---> 阿里云 ---> 负载均衡SLB Http ---> K8S ---> Nginx ---> fpm ---> Laravel


开发的时候一直用的是 http 协议访问,啥问题都没有。




后来看到浏览器上有个不安全提示,想着云服务器上本来就有域名证书,所以把访问协议改成 https,这时候点击右上角的 login、register 路由前端就报错了。








百度谷歌搜一波


laracasts.com/discuss/channels/lar...


blog.csdn.net/u010347244/article/d...




一堆大佬的招式都是建议在 app/Providers/AppServiceProvider.php 加上以下这个 forceScheme




$url->forceScheme('https');


但并不是我想要的效果。。。




访问 http 就该是 http,https 就得自动是 https 才对。




只能 dd () 一波


routes/web.php






































wocao!!!怎么到了 UrlGenerator 线索就断了。。。




Laravel 的水真深,后来换骚操作,全局搜代码 UrlGenerator








还真找到了对应的 UrlGenerator




























至此找到了最终的线索:




$this->isFromTrustedProxy() — 已经配置过信任的代理 ip


self::HEADER_X_FORWARDED_PROTO — 这个是新姿势!!!


百度谷歌一顿 nginx HEADER_X_FORWARDED_PROTO 终于找到了对应的解决方案:




Nginx 反向代理加上以下这句:




#设置向后端proxy发送X-Forwarded-Proto字段


proxy_set_header X-Forwarded-Proto $scheme;


生产环境阿里云负载均衡配置搜了下文档,找到了相应配置入口


help.aliyun.com/document_detail/86...




















搞定!




总结


遇到问题耐心搜索 + dd (),可以掌握新姿势


Laravel 有些码从 IDE 跳进去看不到真实的类,可以骚操作全局搜索一下


https 反向代理 http,nginx 配置那要向后端 proxy 发送 X-Forwarded-Proto 字段




有话要说