yii2 报错 Bad Request: 您提交的数据无法被验证。
同事反映公司小程序管理后台添加商品,当商品规格较多时,提交数据会报这样的错误:“Bad Request: 您提交的数据无法被验证。”
网上搜了一下,发现所有人的解决办法都指向了 _csrf
验证,要么关闭验证,要么在提交的表单中嵌入验证字段。
关闭 csrf 验证:
配置文件 web.php
...
'components' => [
'request' => [
'class' => 'app\hejiang\Request',
'cookieValidationKey' => env('COOKIE_KEY', 'C86SfpluqpUwqzEp4MSl_mchb2Wr6ris'),
'enableCsrfValidation' => false,
],
...
或在控制器中添加 public $enableCsrfValidation = false;
。
表单添加 csrf 验证字段:
<input name="_csrf" type="hidden" id="_csrf" value="<?= Yii::$app->request->csrfToken ?>">
[notice]当然这些都不管用,如果管用,也就不用专门写篇文章说明了 OωO 。[/notice]
因为商品规格较少时是不报错的,且看了一下代码,表单中是有添加了 csrf 验证字段的。那么就两种情况了,一种是前端字段没传递到后台,另一种就是后台没有接受到。
前端通过 F12 查看到了 _csrf
字段,前端排除。在对应控制器方法中打断点(xdebug)赋值 \Yii::$app->request->post()
给一个变量,查看后台接受到的数据,发现进程并没有走到断点就结束了。
检查了一下,是 yii2 先去做 csrf 校验了。使用上面的方法关闭 csrf 校验,再次提交表单,断点调试。查看接受到的数据,发现商品规格部分数据有丢失,且 csrf 字段也丢失了(csrf 放在表单末尾提交的)。这说明传递的数据有丢失的情况。
数据丢失要么是提交的数据超过了最大限制 post_max_size
,要么是 post 请求包含的变量数超过了最大限制 max_input_vars
。post_max_size
为 8M
没有动过,没有传文件不太可能超过的。max_input_vars
默认值为 1000,改成 2000,再次调试,商品规格数组多了一些,但数据仍然不全。增加 max_input_vars
到 10000,表单提交成功!
附:匠禾小程序果然专业,后面看到这篇常见文件解决,问题定位很精准。