同事反映公司小程序管理后台添加商品,当商品规格较多时,提交数据会报这样的错误:“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 放在表单末尾提交的)。这说明传递的数据有丢失的情况。

input variables exceeded 1000

数据丢失要么是提交的数据超过了最大限制 post_max_size,要么是 post 请求包含的变量数超过了最大限制 max_input_varspost_max_size8M 没有动过,没有传文件不太可能超过的。max_input_vars 默认值为 1000,改成 2000,再次调试,商品规格数组多了一些,但数据仍然不全。增加 max_input_vars 到 10000,表单提交成功!

附:匠禾小程序果然专业,后面看到这篇常见文件解决,问题定位很精准。