Laravel(Nginx+Cloudflare+Docker环境)使用Livewire上传文件返回401 Unauthorized问题求助
大家好,最近我在生产环境部署的Laravel项目里,用Livewire做文件上传功能时踩了个坑——上传请求直接返回401 Unauthorized,折腾了好一阵才解决,把过程和方案分享出来,希望能帮到遇到同样问题的朋友。
我的环境配置
- Cloudflare开启Flexible SSL模式(浏览器→加密连接Cloudflare→未加密连接源服务器)
- 用Nginx做反向代理,搭配PHP-FPM
- 整个服务跑在Docker容器中
问题现象
我原本预期文件能正常上传并存储到指定位置,但实际测试时,Livewire的上传请求直接被Laravel拦截,返回401 Unauthorized。查Laravel日志发现,是请求签名验证失败导致的拦截。
排查过程
我一开始怀疑是Session配置出了问题,反复核对了.env里的SESSION_DOMAIN、SESSION_SECURE等参数,确认和当前域名、SSL场景匹配;接着又去检查Nginx的反向代理配置,确保转发请求时没有丢失关键请求头;最后还手动看了Livewire生成的临时上传URL,格式也没发现异常。
问题根源
折腾半天后终于找到原因:Cloudflare Flexible SSL的架构导致请求协议不统一——浏览器和Cloudflare之间是HTTPS,但Cloudflare到我的源服务器(Docker里的Nginx)是HTTP。而Livewire在生成上传请求签名时,会依赖当前请求的scheme(HTTP/HTTPS),源服务器收到的是HTTP请求,可前端页面是通过HTTPS加载的,这就造成签名生成时用的协议和前端实际请求的协议不一致,最终触发签名验证失败,返回401。
另外,Nginx反向代理时没有正确传递真实的请求协议,也导致Laravel无法识别用户实际是用HTTPS访问的,进一步影响了Livewire的签名逻辑。
解决方案
1. 让Laravel识别真实请求协议
修改Nginx的站点配置,在反向代理的location块中添加以下请求头,强制告诉Laravel实际请求是HTTPS:
proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Host $host;
同时在Laravel的config/trustedproxy.php中,把Cloudflare的IP段(或Docker中Nginx容器的IP)加入可信代理列表,这样Laravel才会信任这些X-Forwarded-*请求头。
2. 配置Livewire信任代理
在config/livewire.php中开启信任代理设置,和Laravel的可信代理保持一致:
'trust_proxies' => true,
也可以指定具体的代理IP/IP段,比如Cloudflare的官方IP范围。
3. 调整Session安全配置
在.env中设置Session仅在HTTPS环境下传递,匹配前端的访问场景:
SESSION_SECURE=true
验证效果
把以上配置调整完成后,重启Nginx和Laravel容器,再测试Livewire文件上传,就能正常完成上传流程了,401 Unauthorized的报错也彻底消失。
如果大家有类似的环境配置,或者还有其他相关的问题,欢迎一起交流~




