Bad Request (#400) и data-method="post"

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
codrilla
Сообщения: 173
Зарегистрирован: 2013.03.06, 12:24
Откуда: Молдова, Тирасполь

Bad Request (#400) и data-method="post"

Сообщение codrilla »

Внезапно появилась следующая ошибка и не могу выяснить почему
При переходе по ссылке
<a href="/site/logout" data-method="post">Выйти (username)</a>
Выдаёт ошибку
Bad Request (#400)
Не удалось проверить переданные данные.
The above error occurred while the Web server was processing your request.

Please contact us if you think this is a server error. Thank you.

То же самое при переходе по другой ссылке с data-method="post"
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Bad Request (#400) и data-method="post"

Сообщение zelenin »

echo Html::csrfMetaTags(); прописано в layout?
codrilla
Сообщения: 173
Зарегистрирован: 2013.03.06, 12:24
Откуда: Молдова, Тирасполь

Re: Bad Request (#400) и data-method="post"

Сообщение codrilla »

Нет. Но ситуация такая, что до этого работало. И по какой причине перестало, я понять не могу.
Прописал по вашему совету и теперь действительно работает.
Благодарю за помощь.
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: Bad Request (#400) и data-method="post"

Сообщение lynicidn »

csrf
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Bad Request (#400) и data-method="post"

Сообщение zelenin »

codrilla писал(а):Нет. Но ситуация такая, что до этого работало. И по какой причине перестало, я понять не могу.
Прописал по вашему совету и теперь действительно работает.
Благодарю за помощь.
причина: изменение в фреймворке.
webster
Сообщения: 36
Зарегистрирован: 2011.12.17, 13:17

Re: Bad Request (#400) и data-method="post"

Сообщение webster »

Простой вызов <?php $this->head() ?> в layout также должен добавить нужные meta.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Bad Request (#400) и data-method="post"

Сообщение zelenin »

webster писал(а):Простой вызов <?php $this->head() ?> в layout также должен добавить нужные meta.
отчего же?
webster
Сообщения: 36
Зарегистрирован: 2011.12.17, 13:17

Re: Bad Request (#400) и data-method="post"

Сообщение webster »

zelenin писал(а):
webster писал(а):Простой вызов <?php $this->head() ?> в layout также должен добавить нужные meta.
отчего же?
Понятья не имею. Дебагером не изучал вызовы, но думаю если csrf активирован? то теги добавляются - это логично как бы.

Вот у меня перед глазами примерно такой layout:

Код: Выделить всё

/**
 * @var \yii\web\View $this
 * @var string $content
 */
AppAsset::register($this);
?>

<?php $this->beginPage() ?>
<!DOCTYPE html >
<html lang="<?= Yii::$app->language ?>"
      ng-app="..."
      data-app-base-path="<?= Yii::$app->getRequest()->getBaseUrl() ?>">
<head>
    <meta charset="<?= Yii::$app->charset ?>"/>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title><?= Html::encode($this->title) ?></title>
    <?php $this->head() ?>
</head>

<body>
<?php $this->beginBody() ?>
<div class="wrap">
    <?php
    NavBar::begin(
        [
            'brandLabel' => Yii::$app->name,
            'brandUrl' => Yii::$app->homeUrl,
            'options' => [
                'class' => 'navbar-inverse navbar-fixed-top',
            ],
        ]
    );
    echo Nav::widget(
        [
            'options' => ['class' => 'navbar-nav navbar-right'],
            'items' => [
                [
                    'label' => 'Модели',
                    'url' => ['/frontend/models/index'],
                    'visible' => !Yii::$app->user->isGuest
                ],
                [
                    'label' => 'Предложения',
                    'url' => ['/frontend/offer/index'],
                    'visible' => !Yii::$app->user->isGuest
                ],
                [
                    'label' => 'Login',
                    'url' => ['/userManager/frontend/identity/login'],
                    'visible' => Yii::$app->user->isGuest
                ],
                [
                    'label' => 'Logout',
                    'url' => ['/userManager/frontend/identity/logout'],
                    'linkOptions' => ['data-method' => 'post'],
                    'visible' => !Yii::$app->user->isGuest
                ],
            ],
        ]
    );
    NavBar::end();
    ?>

    <div class="container">
        <div class="container-fluid">
            <div class="row" ng-view><?= $content ?></div>
        </div>
    </div>
</div>

<footer class="footer">
    <div class="container">
        <p class="pull-left">&copy; <?= date('Y') ?></p>

        <p class="pull-right"><?= Yii::powered() ?></p>
    </div>
</footer>

<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>
В итоге на странице все meta на месте.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Bad Request (#400) и data-method="post"

Сообщение zelenin »

когда последний раз обновляли фреймворк?)
webster
Сообщения: 36
Зарегистрирован: 2011.12.17, 13:17

Re: Bad Request (#400) и data-method="post"

Сообщение webster »

Ха, и впрямь обновил и уже нет. Хотя вроде не так давно обновлял пакеты. Чем не нравилось им решение, удобно же было лишние телодвижения не надо было делать. Сделали бы хотя бы настройку в конфиге что ли. Бред какой-то, может бага, пофиксят.
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: Bad Request (#400) и data-method="post"

Сообщение lynicidn »

там проблема была, что если письмо на емейл идет в хтмл, то цсрф тоже туда попадал, что как бы не логично
sawa4
Сообщения: 5
Зарегистрирован: 2015.07.14, 14:38

Re: Bad Request (#400) и data-method="post"

Сообщение sawa4 »

Всем привет!
Ребят ну у меня есть токен, в чем еще может быть проблема?

http://c2n.me/3ohoGra

в layout

http://c2n.me/3ohoO6U

на локальном все работает (Open Server)
на сервере после загрузки работает ровно около 2 суток потом, ошибка + в backend появилась такая картина

http://c2n.me/3ohp8Ra

РНР на сервере 5.4.45

Версия Yii 2.0.4
bert
Сообщения: 41
Зарегистрирован: 2013.01.16, 08:18

Re: Bad Request (#400) и data-method="post"

Сообщение bert »

Сейчас только столкнулся с той же проблемой и решил ее.

Дело в том, что данные csrf передаются через куки. Но срок жизни соответствующего ключа в куки меньше, чем у куки авторизации.
И когда фреймворк не видит этот ключ, то генерится новый и заново кладется в куки.

Но что-то мешает ему установить новый ключ. Как выяснилось, фреймворк пропускает установку куки в случае, если до этого момента какие-то хедеры были уже отправлены в http ответ сервера. Например, это происходит, когда скрип начинает писать в поток вывода до установки cookie.

Весь текст отображения (echo) должен попадать в буфер и потом этот результат выводится в поток вывода уже после установки всех хедеров, включая cookie.
Я забыл поставить <?php $this->beginPage() ?> в начале шаблона - это метод, который открывает буфер. Поэтому текст просто выводился сразу. Возможно, у вас в другом месте текст попадает поток.
Попробуйте написать в действии

Код: Выделить всё

$this->render('index', [
    'model' => $model,
]);
без return. Вывод должен быть пустым. Если отображается вся страница или какой-то текст - значит у вас то, о чем я написал и надо искать, почему текст вывелся, а не попал в буфер.
Ответить