使用带Sticky Session的DigitalOcean负载均衡时Laravel API出现CSRF Token不匹配
Laravel 8 负载均衡场景CSRF 419错误解决方案
1. 修正XSRF-TOKEN的HttpOnly属性
生产环境XSRF-TOKEN被自动加上HttpOnly标记,多是服务器全局安全配置导致,无需在Apache层硬改规则,直接在Laravel应用层重写逻辑强制关闭即可:
打开app/Http/Middleware/VerifyCsrfToken.php,新增如下方法覆盖父类逻辑:
protected function addCookieToResponse($request, $response) { $sessionConfig = config('session'); $response->headers->setCookie( cookie( 'XSRF-TOKEN', $request->session()->token(), $this->availableAt(60 * $sessionConfig['lifetime']), $sessionConfig['path'], $sessionConfig['domain'], $sessionConfig['secure'], false, // 强制关闭HttpOnly属性,允许JS读取 $sessionConfig['same_site'] ?? null ) ); return $response; }
2. 配置信任代理修正请求识别
负载均衡场景下后端节点收到的请求协议、域名和客户端实际访问的不一致,会导致Laravel无法正确读取会话Cookie,这是更新3中token一致仍报错的核心原因:
- 打开
app/Http/Middleware/TrustProxies.php,修改$proxies属性,允许Laravel信任负载均衡的转发请求:
// 测试环境可直接设为*,生产环境建议填写DO负载均衡的内网IP段提升安全性 protected $proxies = '*';
确认类头部引入的$headers属性包含Request::HEADER_X_FORWARDED_PROTO,Laravel 8默认已配置。
3. 调整会话&Sanctum配置
打开项目根目录.env文件,修改以下参数适配负载均衡访问域名:
SESSION_DOMAIN:填写负载均衡对外服务的根域名,例如站点访问地址为spa.example.com,则填写.example.comSESSION_SECURE_COOKIE:如果负载均衡对外开启HTTPS,无论后端节点是否用HTTPS,统一设为trueSESSION_SAME_SITE:设为laxSANCTUM_STATEFUL_DOMAINS:填写前端页面的完整访问域名(非80/443端口需带上端口)
4. 生效验证
执行以下命令清除Laravel缓存:
php artisan config:clear php artisan cache:clear
清除浏览器Cookie与本地存储后重新访问即可正常通过CSRF校验。
内容的提问来源于stack exchange,提问作者Boardy
相关产品推荐
相关产品推荐

