400 Bad Request
- потому что csrf-token
не отправляется, с запросом, который необходим для предотвращения межсайтовых атак Yii всякий раз, когда вы используете POST
для отправки запроса страницы или ajax, если вы создаетеActiveForm
затем автоматически создает ввод со значением токена.
Вы не добавили код, который используете для вызова ajax, поэтому неясно, используете ли вы его только для одного поля или всей формы, поэтому я бы предложил только соответствующую часть.
Вам необходимо отправить токен csrf, и вы можете получить его через javascript, используя yii.js
и вызывая эти 2 метода
yii.getCsrfParam()
, чтобы получить имя параметра токена yii.getCsrfToken()
для получения токена или фактического значения токена csrf
Имя csrfParam
настраивается внутри frontend/config.php
или config/web.php
в зависимости от приложениявы используете (продвинутый / базовый) в компоненте request
, как показано ниже
'components'=>[
......
......
'request' => [
'csrfParam' => '_csrf-frontend',
],
......
......
]
Так что вам нужно либо изменить метод запроса с POST
на GET
и отправить данные с помощью запросавведите строку или используйте следующий способ для отправки запроса POST
.
Note: You should change the URL and add the csrf data into your existing data that you are sending with the request
let data={};
data[yii.getCsrfParam()]=yii.getCsrfToken();
$.ajax(
{
method:"POST",
url:"/site/test",
data:data,
success:function(data) {
console.log(data);
},
error:function(jqXHR,textStatus,errorThrown) {
console.log(jqXHR,textStatus,errorThrown);
}
}
);
Если у вас есть действие test
внутри SiteController
со следующим кодом, то вышеупомянутый вызов ajax должен показать вам массив $_POST
внутри консоли с параметром csrf и значением токена как key=>value
.
public function actionTest()
{
print_r($_POST);
}