Yii2 CSRF验证失败主因是令牌不一致:AJAX中误用csrfToken动态生成新值,而应从读取初始令牌;手写表单需手动添加隐藏字段;前后端分离时须确保cookie域名/路径配置正确。

Yii 的 CSRF 验证失败,90% 是因为令牌没对上——不是没传,是传了但值变了、或来源不一致。
为什么 AJAX 提交总报 400 “Unable to verify your data submission”
根本原因不是 CSRF 功能坏了,而是 JavaScript 中用了 \yii::$app->request->csrfToken 动态取值。这个方法每次调用都会生成新令牌,而页面加载时 <meta name="csrf-token"> 和表单隐藏字段里存的是“初始令牌”。AJAX 请求头里塞了个新值,服务器一比对就失败。
- ✅ 正确做法:从 DOM 里读,比如
$('meta[name="csrf-token"]').attr('content') - ❌ 错误写法:
'X-CSRF-Token': '= \yii::$app->request->csrfToken ?>'(服务端模板渲染时就错了) - 检查点:打开浏览器开发者工具 → Elements → 搜
csrf-token,确认 meta 标签存在且 content 不为空;再看 Network → 请求 Headers →X-CSRF-Token值是否和 meta 里完全一致










