Laravel 10特定系统中出现CSRF token mismatch错误
Laravel 10 Ajax表单CSRF Token不匹配问题排查方案
一、排查特定系统的网络环境
- 检查该系统是否存在企业级代理、防火墙或安全软件,这类设备可能会拦截或修改Laravel生成的
XSRF-TOKENCookie,导致Token无法正常传递。 - 确认目标域名是否在
config/session.php的domain配置项中,跨子域名场景下,session域名配置错误会直接导致Cookie无法被浏览器携带。
二、验证Ajax请求的Token携带逻辑
确保Ajax请求正确携带CSRF Token,两种标准实现方式:
- 请求头携带:通过
X-XSRF-TOKEN头传递解码后的Cookie值(Laravel存储的XSRF-TOKEN是URL编码状态),示例代码:$.ajaxSetup({ headers: { 'X-XSRF-TOKEN': decodeURIComponent(document.cookie.match(/XSRF-TOKEN=([^;]+)/)[1]) } }); - 表单字段携带:先在页面头部渲染CSRF Token meta标签,再在请求数据中加入
_token字段,示例代码:<meta name="csrf-token" content="{{ csrf_token() }}">$.ajax({ url: '/your-submit-url', method: 'POST', data: { _token: $('meta[name="csrf-token"]').attr('content'), // 其他表单数据 } });
- 检查特定系统下的页面是否正确渲染了
csrf-tokenmeta标签,避免因页面缓存或动态渲染失败导致Token缺失。
三、检查Laravel核心配置
- 确认
config/cors.php中supports_credentials设置为true,跨域(含同域名不同端口)场景下必须开启该选项才能携带Cookie。 - 检查
config/session.php的secure配置:若该系统为HTTPS环境,需设为true;HTTP环境则设为false或env('SESSION_SECURE_COOKIE', false),否则浏览器会拒绝携带Cookie。 - 调整
config/session.php的same_site配置:避免设为Strict,可改为Lax;跨域场景需设为None(必须配合secure: true)。
四、排查浏览器Cookie权限
- 让用户在目标浏览器中检查站点Cookie权限:Chrome/Edge可通过地址栏锁图标→「Cookie和站点数据」确认是否允许该网站的Cookie,第三方Cookie场景需额外开启权限。
- 确认浏览器未开启「阻止第三方Cookie」或隐私模式,这类模式会限制Cookie的传递逻辑。
五、临时调试验证
- 在
app/Http/Middleware/VerifyCsrfToken.php的$except数组中临时加入请求URL,若不再报错则可锁定为CSRF验证问题,再回溯前面的排查步骤。 - 在控制器或中间件中打印请求头和Cookie信息,确认Token是否被正确携带:
dd(request()->header(), request()->cookie());
内容的提问来源于stack exchange,提问作者Divyabanu S
相关产品推荐
相关产品推荐

