yii2出现的400错误
来一段百度来的正常解决方法,注意有很大的坑!
第一种解决办法是关闭Csrf
1配置文件关闭
2控制器里面关闭
public function init(){ $this->enableCsrfValidation = false; }
第二种解决办法是在form表单中加入隐藏域
<input name="_csrf" type="hidden" id="_csrf" value="<?= Yii::$app->request->csrfToken ?>">
第三种解决办法是在AJAX中加入_csrf字段
var csrfToken = $('meta[name="csrf-token"]').attr("content"); $.ajax({ type: 'POST', url: url, data: {_csrf:csrfToken}, success: success, dataType: dataType });
我用ajax提交的,又不想关闭csrf验证(不推荐),所以选择第三种解决方法,在data中添加
参数 _csrf:csrfToken,之后试了很多次还是报错400,原因是_csrf 这个参数需要和你的配置文件定义的一致才行,
不能直接使用_csrf
例如我的main.php配置文件设置的名称是_csrf-frontend,所以你在ajax提交的数据也要使用_csrf-frontend,而不是_csrf
要改为:
var csrfToken = $('meta[name="csrf-token"]').attr("content"); $.ajax({ type: 'POST', url: url, data: {'_csrf-frontend':csrfToken}, success: success, dataType: dataType });
注意第二种解决方法中也要注意这个参数名
还有问题要注意
如果你的页面没有form的话,ajax的post提交是没问题的,用ajax的post提交会自动产生_csrf
如果你的页面是有form尤其是上传文件类型为file的话,ajax的post还是会出现400验证的
假如文件上传接收为空值:注意配置文件ini这三个参数问题
max_execution
post_max_size
upload_max_filesize