laravel 5.5 Срок действия страницы истек из-за неактивности. Пожалуйста, обновите и повторите попытку
Я новичок в Laravel, и у меня есть проблема, которую я не понимаю. У меня есть форма журнала в моем проекте, и мой метод - POST. Когда я пытаюсь выполнить запрос, результат таков: "Срок действия страницы истек из-за бездействия. Пожалуйста, обновите и повторите попытку"., но если я изменю метод, чтобы получить, он будет работать нормально. Может кто-нибудь сказать мне, почему это так и как это исправить, потому что, конечно, мне нужен метод post.
22 answers
Эта проблема возникает из-за сбоя проверки токена CSRF. Так что либо вы его не публикуете, либо публикуете неверный.
Причина, по которой это работает для GET, заключается в том, что для маршрута GET в Laravel не размещен токен CSRF.
Вы можете либо разместить токен CSRF в своей форме, позвонив по телефону:
{{ csrf_field() }}
Или исключите свой маршрут (НЕ РЕКОМЕНДУЕТСЯ ИЗ-ЗА БЕЗОПАСНОСТИ) в app/Http/Middleware/VerifyCsrfToken.php
:
protected $except = [
'your/route'
];
В моем случае я получил то же сообщение об ошибке, а затем понял, что пропустил добавление csrf_token
для поля формы. Затем добавьте csrf_token
.
Используя помощник формы, который будет,
{{ csrf_field() }}
Или без помощника по форме, который будет,
<input type="hidden" name="_token" value="{{ csrf_token() }}">
Если это не сработает, то -
Обновите кэш браузера
И теперь это может сработать, спасибо.
Обновление Для Laravel 5.6
Laravel интегрирует новый @csrf
вместо {{ csrf_field() }}
. Тот теперь выглядит более привлекательно.
<form action="">
@csrf
...
</form>
Всякий раз, когда вы определяете HTML-форму в своем приложении, вы должны включать скрытое поле маркера CSRF в форму, чтобы промежуточное программное обеспечение защиты CSRF могло проверить запрос. Вы можете использовать помощник csrf_field
для создания поля токена:
<form method="POST" action="/profile">
{{ csrf_field() }}
...
</form>
Это не работает, затем обновите кэш браузера, и теперь это может сработать,
Для получения более подробной информации откройте ссылку:- Защита CSRF в Laravel 5.5
ОБНОВЛЕНИЕ:
С Laravel 5.6 с использованием лезвий шаблоны, это довольно просто.
<form method="POST" action="/profile">
@csrf
...
</form>
Для получения более подробной информации откройте ссылку:- Защита CSRF в Laravel 5.6
Убедитесь, что ваш config/session.php файл содержит эту строку
'domain' => env('SESSION_DOMAIN', null),
Затем удалите строку SESSION_DOMAIN
в файле .env
У меня была та же проблема. используйте "очистить данные просмотра" в Chrome. может быть, решите вашу проблему.
Это происходит потому, что вы используете промежуточное ПО CSRV по умолчанию из установки Laravel. Чтобы решить эту проблему, удалите эту строку из вашего Kernel.php :
\App\Http\Middleware\VerifyCsrfToken::class,
Это нормально, если вы создаете API. Однако, если вы создаете веб-сайт, это проверка безопасности, поэтому будьте осведомлены о ее рисках.
Просто поместите этот код в форму
<input type = "hidden" name = "_token" value = "<?php echo csrf_token() ?>" />
Я столкнулся с той же ошибкой, поэтому я просто удалил эту строку из своего файла .env
SESSION_DRIVER=yourwebsite.com
Если у вас задана конфигурация: SESSION_DRIVER=файл, вы должны проверить, доступен ли каталог сеанса для записи. Проверьте хранилище/структуру/сеанс
В течение нескольких недель безуспешно пробовал различные решения этой проблемы.
Проблема, с которой я столкнулся, была вызвана обновлением с laravel 5.0 до 5.5 и я забыл обновить config/session.php
Если кто-то столкнулся с проблемой, попробуйте обновить config/session.php чтобы соответствовать версии на Laravel, которую вы используете
Если вы уже включили маркер CSRF в свою форму. Затем вы получаете страницу с ошибкой, возможно, из-за данных кэша в вашей форме. Откройте терминал/командную строку и запустите эти команды в корневом каталоге проекта.
- кэш php artisan: очистить
- конфигурация php artisan: очистить
- маршрут php-ремесленника: очистить
- представление php-мастера: очистить
Также попробуйте очистить кэш браузера вместе с выполнением этих команд.
В моем случае та же проблема была вызвана тем, что я забыл добавить >
в конце моего скрытого поля ввода, вот так: <input type="hidden" name="_token" value="{{ Session::token() }}"
Итак, я исправил это, добавив:
<input type="hidden" name="_token" value="{{ Session::token() }}">
Забавно, но для меня это работает. я понял, что это вызвано из-за HTML-ТЕГА по умолчанию в коде laravel. Используйте /**/ или {{----}} вместо
Или попробуйте удалить недавний Html-комментарий в вашем коде... Или измените Html-комментарий на Php-комментарий... Или попробуйте запустить любую команду Worng artisan, такую как php artisan clean browser, И посмотрите, выводит ли она какие-либо данные с комментариями HTML вместе с ошибкой...
Мы заставили его работать, скопировав маршруты из 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');
В моем случае я добавил ob_start(); в верхней части моего index.php на сервере, и все, кажется, работает нормально.
Я знаю, что на этот вопрос был дан удовлетворительный ответ, но я хотел упомянуть исправление, которое сработало в моем случае. Я добавил {{ csrf_field() }}
, но это все равно не сработало.
Затем я вспомнил, что заблокировал все файлы cookie в целях разработки, что может быть полезно, когда вы меняете страницу и хотите ее обновить.
Как только я изменил настройки, чтобы перестать блокировать все файлы cookie в MS Edge browser
, проблема исчезла.
Моя проблема решена простым добавлением @csrf
в тег формы
Laravel 5.6
не поддерживает {{ csrf_field() }}
просто добавьте @csrf
вместо {{ csrf_field() }}
Larvel_fix_error.png - ошибка.
Просто добавьте @csrf
внутри тега формы.
Или вы можете включить csrf_token
в заголовок, чтобы отправлять его с каждым запросом.
Это может быть токен csrf, которого нет в вашей форме. Вы должны использовать
@crsf
или{{ csrf_field() }}
-
Если вы используете csrf в своей форме. Это может быть кэш. Очистите кэш вашего приложения.
Кэш Php artisan: очистить
Представление Php-мастера: очистить
Кэш Php artisan: очистить
И очистите кэш вашего браузера.
- Если ошибки снова появятся, создайте новый ключ
Ключ Php-мастера: сгенерировать
Все еще у кого есть эта проблема, используйте следующий код в своей форме, как показано ниже.
echo '<input type = "hidden" name = "_token" value = "'. csrf_token().'" >';
Войдите в
App/Kernel.php
и комментарий
\App\Http\Middleware\VerifyCsrfToken::class
.