You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用带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.com
  • SESSION_SECURE_COOKIE:如果负载均衡对外开启HTTPS,无论后端节点是否用HTTPS,统一设为true
  • SESSION_SAME_SITE:设为lax
  • SANCTUM_STATEFUL_DOMAINS:填写前端页面的完整访问域名(非80/443端口需带上端口)

4. 生效验证

执行以下命令清除Laravel缓存:

php artisan config:clear
php artisan cache:clear

清除浏览器Cookie与本地存储后重新访问即可正常通过CSRF校验。

内容的提问来源于stack exchange,提问作者Boardy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:18:00