Laravel代码正常却突然出现CSRF token mismatch错误,清缓存也无法解决
CSRF token mismatch 报错排查及解决方案
高频触发原因(突然报错优先排查)
- JS代码位置变更:如果你近期把这段AJAX代码从Blade模板文件抽离到了独立的
.js静态文件,Blade的{{ csrf_token() }}模板语法不会被静态文件解析,会直接作为字符串输出,而非实际的token值,导致参数校验失败。 - 域名/访问协议变更:之前用HTTP访问项目,近期切换到HTTPS,或者前后端端口/域名有调整,导致Session Cookie跨域/跨协议无法携带,token匹配失败。
- Session配置修改:近期调整过
config/session.php里的domain、secure、same_site参数,或者切换过Session存储驱动(比如从file改到redis)没有配置正确,导致Session无法正常读写,每次请求生成新的token。
分步排查操作
- 校验token实际值:打开浏览器控制台,找到对应AJAX请求的Payload,查看
_token参数的实际值,再查看页面源代码里{{ csrf_token() }}渲染出来的内容是否一致,同时对比Cookie里的XSRF-TOKEN值,三者不一致就是token参数错误。 - 验证Session有效性:清理浏览器Cookie后重新刷新页面,再次提交请求看是否还报错,换非隐身模式/其他浏览器访问测试,排除本地Cookie禁用/过期问题。
- 检查配置改动:回退近期修改的Session、中间件、跨域相关配置,看问题是否消失。
对应解决方法
- 静态JS文件获取token方案:在Blade模板的
<head>标签内添加meta标签存储token:
<meta name="csrf-token" content="{{ csrf_token() }}">
全局配置AJAX默认携带CSRF header,不用每个请求单独传_token参数:
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } });
- 跨域/HTTPS适配:如果是跨域请求,在AJAX配置中添加
withCredentials: true,同时后端config/cors.php里将supports_credentials设置为true;HTTPS场景下将config/session.php的secure参数修改为env('SESSION_SECURE', false),本地开发HTTP环境下自动关闭,线上HTTPS配置对应环境变量即可。 - Session修复:如果是Session存储权限问题,给项目storage目录设置正确权限:
chmod -R 755 storage,存储驱动切换后确认驱动配置、连接正常。
内容的提问来源于stack exchange,提问作者Rishabh
相关产品推荐
相关产品推荐

