Такая ошибка обычно говорит, что проблема с токеном CSRF. Токена нет или токен не тот. Этот токен нужно передавать как в POST так и в AJAX запросах.
На английском эта ошибка звучит так:
Bad Request (#400): Unable to verify your data submission
Проблему можно решить тремя способами:
Два неправильных способа — отключить проверку для всего приложения в конфиге или отключить в конкретном месте. Смотрите код ниже:
1 2 3 4 5 6 7 8 9 10 11 12 |
//В файле конфигурации отключаем для всего приложения 'components' => [ 'request' => [ ... 'enableCsrfValidation'=>false, ... ], ... ], // Отключаем в конкретном месте $this->enableCsrfValidation = false; |
А теперь правильный способ.
Всегда передавать валидный CSRF токен! В Yii2 для этого есть все инструменты.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//В мета тэгах вашего шаблона echo Html::csrfMetaTags(); //это добавит строки содержащие имя параметра и сам токен <meta name="csrf-param" content="_csrf"> <meta name="csrf-token" content="OTDOwBtYk-tsjYLIgTAXrqhKwU-WgneMk_TpFcbE6DwPCIu3XRPJhj202Jn0Z3TP4Ry3ecevOcC-x4ZQkKu8dg=="> //В формах <input type="hidden" name="_csrf" value="OTDOwBtYk-tsjYLIgTAXrqhKwU-WgneMk_TpFcbE6DwPCIu3XRPJhj202Jn0Z3TP4Ry3ecevOcC-x4ZQkKu8dg=="> //Если форму создавать методами ActiveForm::begin() и Html:beginForm(), то input будет подставляться автоматически //Если же вы сами создаёте форму, то пишите так <input type="hidden" name="<?=Yii::$app->request->csrfParam; ?>" value="<?=Yii::$app->request->getCsrfToken(); ?>" /> //Если отправляете ajax запрос, то в javascript можно получить csrf токен из метатэгов var param = $('meta[name="csrf-param"]').attr("content"); var token = $('meta[name="csrf-token"]').attr("content"); $.ajax({ url: 'https://help1c.su', type: 'post', dataType: 'json', data: {'data1': data1, 'data2': data2,....., param : token}, }); |