laravel 5.5 Срок действия страницы истек из-за неактивности. Пожалуйста, обновите и попробуйте снова

55

Я новичок в Laravel и у меня есть проблема, которую я не понимаю. У меня есть форма журнала в моем проекте, и мой метод POST. Когда я пытаюсь запрос, результат:

"Срок действия страницы истек из-за неактивности. Пожалуйста, обновите и попробуйте снова.

Но если я изменю метод на GET, он будет работать нормально.

Может кто-нибудь сказать мне, почему это и как это исправить? потому что, конечно, мне нужен метод POST.

  • 6
    Пожалуйста, покажите свой код!
  • 0
    Я нашел это полезным для улучшения взаимодействия с пользователем: gist.github.com/jrmadsen67/…
Теги:

25 ответов

142
Лучший ответ

Эта проблема возникает из-за сбоя проверки токена CSRF. Так что либо вы не публикуете один, либо вы публикуете неправильный.

Причина, по которой он работает для GET, заключается в том, что для маршрута GET в Laravel нет размещенного токена CSRF.

Вы можете опубликовать токен CSRF в своей форме, позвонив:

{{ csrf_field() }}

Или исключите ваш маршрут (НЕ РЕКОМЕНДУЕТСЯ ИЗ-ЗА БЕЗОПАСНОСТИ) в app/Http/Middleware/VerifyCsrfToken.php:

protected $except = [
    'your/route'
];
  • 0
    Для всех, кто просматривает это, вы также можете добавить метатег в заголовок вашего сайта, который будет использоваться с большинством запросов.
  • 0
    @Erik Я не совсем уверен, что второй подход подходит. Если мы исключим маршрут в VerifyCsrfToken.php маршрут будет уязвимым для CSRF-атаки, я думаю
Показать ещё 3 комментария
29

В моем случае я получил то же сообщение об ошибке, а затем выяснил, что пропустил добавление csrf_token для поля формы. Затем добавьте csrf_token.

Использование помощника по формам,

{{ csrf_field() }}

Или без помощника формы, который будет,

<input type="hidden" name="_token" value="{{ csrf_token() }}">

Если это не сработает, then-

Обновить кеш браузера

и теперь это может сработать, спасибо.

Обновление для Laravel 5.6

Laravel интегрирует новый @csrf вместо {{ csrf_field() }}. Теперь это выглядит лучше.

<form action="">
   @csrf
   ...
</form>
7

Каждый раз, когда вы определяете HTML-форму в своем приложении, вы должны включить в форму скрытое поле токена CSRF, чтобы связующее ПО защиты CSRF могло проверить запрос. Вы можете использовать помощник csrf_field для генерации поля токена:

<form method="POST" action="/profile">
    {{ csrf_field() }}
    ...
</form>

Это не работает, затем обновите кеш браузера и теперь он может работать,

Для более подробной информации откройте ссылку: - CSRF Protection в Laravel 5.5

ОБНОВИТЬ:

С Laravel 5.6 с использованием шаблонов Blades это довольно просто.

<form method="POST" action="/profile">
    @csrf
    ...
</form>

Для более подробной информации откройте ссылку: - Защита CSRF в Laravel 5.6

  • 0
    Это не идеальное решение. Потому что в случае пользователя, как они будут знать, что они должны удалить кэш.
  • 0
    Когда мы обновляем наше приложение, браузер может по-прежнему использовать старые файлы. Если вы не очистите свой кеш, старые файлы могут получить доступ к проблемам при подаче заявки. для более подробной информации читайте этот laravel.com/docs/5.5/csrf
3

Убедитесь, что ваш файл config/session.php содержит эту строку

'domain' => env('SESSION_DOMAIN', null),

Затем удалите строку SESSION_DOMAIN в вашем файле.env

3

Это происходит потому, что вы используете промежуточное ПО CSRV по умолчанию из установки Laravel. Чтобы решить эту проблему, удалите эту строку из Kernel.php:

\App\Http\Middleware\VerifyCsrfToken::class,

Это нормально, если вы создаете API. Однако, если вы создаете веб-сайт, это проверка безопасности, поэтому имейте в виду его риски.

2

Пробовал разные решения, чтобы решить проблему в течение нескольких недель безуспешно.

Проблема, с которой я столкнулся, была вызвана обновлением с laravel 5.0 до 5.5 и забыл обновить config/session.php

Если кто-то сталкивается с проблемой, попробуйте обновить config/session.php, чтобы он соответствовал версии на Laravel, которую вы используете.

  • 0
    Я искал часы, это тоже была моя проблема, но я обновился до 5.7. Спасибо, что поделился!
2

Поместите {{csrf_field()}} тег form

Изображение 3567

2

У меня была такая же проблема. используйте "четкие данные просмотра" в хроме. может решить вашу проблему.

  • 1
    Это не идеальное решение. Потому что в случае пользователя, как они будут знать, что они должны удалить кэш.
  • 1
    Именно это не лучшее решение.
Показать ещё 1 комментарий
1

Во-первых, включите csrf в вашу форму.

{{ csrf_field() }}

если проблема не решилась, используйте ob_start(); в самом начале index.php.

<?php ob_start();
1

Если вы уже включили токен CSRF в свою форму. Затем вы получаете страницу с ошибкой, возможно, из-за данных кэша в вашей форме.

Откройте свой терминал/командную строку и выполните эти команды в корне вашего проекта.

  1. php artisan cache:clear
  2. php artisan config:clear
  3. php artisan route:clear
  4. php artisan view:clear,

Также попробуйте очистить кеш браузера вместе с этими командами.

1

если ваша конфигурация установлена: SESSION_DRIVER = файл, вы должны проверить, доступен ли для записи каталог вашей сессии. Проверьте хранилище/рамки/сеанс

1

В моем случае я добавил ob_start(); в верхней части моего index.php на сервере, и все, кажется, работает нормально.

1

Я столкнулся с той же ошибкой, поэтому я просто удалил эту строку из моего.env файла

SESSION_DRIVER = yourwebsite.com

1

Просто разместите этот код внутри формы

<input type = "hidden" name = "_token" value = "<?php echo csrf_token() ?>" />
  • 0
    Какой код? Вы не поделились кодом
  • 0
    <form method = "POST" action = ""> <input type = "hidden" name = "_token" value = "<? php echo csrf_token ()?>" /> / * создайте форму * / </ form>
0

У меня была такая же проблема, я пробовал много решений. но никто не работал для меня. затем я узнал, что по какой-то причине я использовал это в своем файле .env:

SESSION_DOMAIN = myapp.me

и как только я вернул его к нулю, все заработало просто отлично.

0

если вам нужно изменить действие формы с Javascript, у вас будет та же проблема

1. сначала вам нужно использовать вместо {!!Form::open() !!} {!! close() !!} {!!Form::open() !!} {!! close() !!} в laravel
2. во-вторых, вы чаще всего начинаете свое действие с https://www.example.com +your Route

Не забудьте WWW в вашем URL!

0
  1. Это может быть токен csrf, которого нет в вашей форме. Вы должны использовать @crsf или {{ csrf_field() }}

  2. Если вы используете csrf в вашей форме. Это может быть кеш. Очистите кеш вашего приложения.

    php artisan cache:clear
    php artisan view:clear
    php artisan cache:clear
    

    И очистите кеш вашего браузера.

  3. Если ошибки снова показывают вам, то создайте новый ключ

    php artisan key:generate
    
0

Просто добавьте @csrf внутри тега формы.

Или вы можете включить csrf_token в заголовок, чтобы отправлять его при каждом запросе.

0

моя проблема решена простым добавлением @csrf в тег формы

Laravel 5.6 не поддерживает {{ csrf_field() }} просто добавьте @csrf вместо {{ csrf_field() }}

larvel_fix_error.png

Изображение 3568

0

Я знаю, что на этот вопрос был получен удовлетворительный ответ, но я хотел бы упомянуть исправление, которое сработало в моем случае. Я добавил {{ csrf_field() }} и он все еще не работал.

Потом я вспомнил, что заблокировал все куки файлы для целей разработки, что может быть хорошо, когда вы меняете страницу и хотите обновить ее.

Как только я изменил настройки, чтобы прекратить блокировку всех файлов cookie в MS Edge browser проблема исчезла.

0

Мы получили его, скопировав маршруты из Router.php вместо использования Auth:: routes(), это маршруты, которые вам нужны:

Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');

// Registration Routes...
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('register', 'Auth\RegisterController@register');

// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');
0

Это смешно, но это работает для меня. Я понял, что это вызвано из-за HTML TAG по умолчанию в коде laravel. Вместо этого используйте /* */или {{-}}

Или попробуйте удалить недавно HTML-код Coment в вашем коде... Или измените комментарий HTML для комментария Php... Или попробуйте запустить команду Any Worng artisan, например, очистить браузер php artisan и посмотреть, выводит ли он какие-либо HTML-данные вместе с ошибкой...

0

В моем случае та же проблема была вызвана тем, что я забыл добавить > в конце моего скрытого поля ввода, например: <input type="hidden" name="_token" value="{{ Session::token() }}"

Итак, я исправил его, добавив его:

<input type="hidden" name="_token" value="{{ Session::token() }}">
-1

Тем не менее, у кого-то есть эта проблема, используйте следующий код внутри формы, как показано ниже.

 echo '<input type = "hidden" name = "_token" value = "'. csrf_token().'" >';
  • 0
    Что означает «внутри вашей формы»? Почему вы хотите, чтобы что-то отражалось напрямую, а не использовать шаблон Twig?
  • 0
    «Внутри вашей формы» означает внутри ваших тегов <form> </ form>. Вы можете использовать приведенный выше код без повторения.
-3

Перейдите в App/Kernel.php и прокомментируйте \App\Http\Middleware\VerifyCsrfToken::class.

  • 0
    Просто поедешь туда, решит свою проблему?
  • 0
    Это отключило бы проверку CSRF все вместе, что не рекомендуется.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню