"Срок действия страницы истек из-за бездействия" - Laravel 5.5
Моя страница регистрации правильно показывает форму с помощью CsrfToken ({{ csrf_field() }}
), представленной в форме).
Форма HTML
<form class="form-horizontal registration-form" novalidate method="POST" action="{{ route('register') }}">
{{ csrf_field() }}
....
</form>
Я использую встроенную аутентификацию для пользователей. Не изменили ничего, кроме маршрутов и перенаправлений.
Когда я отправляю форму (сразу после перезагрузки), она дает, что Истекает страница из-за неактивности. Обновите и повторите попытку..
Мое, что мне не хватает очень маленькой вещи. Но не уверен, что это такое. Любая помощь?
Обновление
Обнаружена проблема. Драйвер сеанса был настроен на массив. Изменен файл, и ошибка исчезла.
Но что не так, если я использую массив?
Ответы
Ответ 1
Если вы пришли к этому ответу непосредственно из поиска, убедитесь, что вы уже добавили токен csrf в свою форму с помощью {{ csrf_field() }}
, как OP.
Если ваш драйвер сеанса установлен в файл:
Может быть связано с тем, что storage_path недоступен для записи. Здесь хранятся данные о токенах, если вы используете файловые сессии. Можно проверить с помощью is_writable(config('session.files'))
Для OP драйвер сеанса был установлен в массив. Массив только для тестирования. Поскольку данные не сохраняются, они не смогут сравнивать токен при следующем запросе.
Драйвер массива используется во время тестирования и предотвращает сохранение данных в сеансе от того, чтобы быть сохраненным.
https://laravel.com/docs/5.5/session#configuration
Проверьте config/session.php
Наконец, у меня только что возникла проблема: у нас был проект с доменом сеанса и настройками безопасности в config/session.php, но сайт разработки не использовал HTTPS (SSL/TLS). Это вызвало эту общую ошибку, так как для sessions.secure было установлено значение true по умолчанию.
Ответ 2
Я столкнулся с той же проблемой в Laravel 5.5. В моем случае это произошло после изменения маршрута с GET на POST. Проблема была в том, что я забыл передать токен CSRF, когда я переключился на POST.
Вы можете отправить токен CSRF в свою форму, вызвав:
{{ csrf_field() }}
Или исключить свой маршрут в приложении /Http/Middleware/VerifyCsrfToken.php
protected $except = [
'your/route'
];
Ответ 3
Попробуйте все из них.
composer dump-autoload
php artisan optimize
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
Ответ 4
Это вызвало из-за Illuminate\Session\TokenMismatchException
взглянуть на этот пример кода, как правильно его обрабатывать:
https://gist.github.com/jrmadsen67/bd0f9ad0ef1ed6bb594e
Ответ 5
Мой случай был решен с помощью SESSION_DOMAIN
, на моей локальной машине должен был быть установлен xxx.localhost
. Это вызывало конфликты с xxx.com
SESSION_DOMAIN
, xxx.com
который был установлен непосредственно в файле конфигурации session.php.
Ответ 6
Некоторая информация хранится в файле cookie, который связан с предыдущими версиями laravel в разработке. Таким образом, он конфликтует с csrf, генерируемыми токенами, которые генерируются другими версиями. Просто очистите файл cookie и попробуйте.
Ответ 7
Для тех, у кого еще есть проблемы и ничего не помогло. Обратите внимание на параметр php.ini mbstring.func_overload. Он должен быть установлен в 0. И mbstring.internal_encoding должен быть в UTF-8. В моем случае это было проблемой.
Ответ 8
В моем случае сайт был в порядке на сервере, но не на локальном. Тогда я помню, что работал над безопасным сайтом.
Поэтому в файле config.session.php установите для переменной secure значение false
'secure' => env('SESSION_SECURE_COOKIE', false),
Ответ 9
Я изменил разрешение на хранение и ошибка исчезла. Казалось, проблема была в отсутствии разрешения.
sudo chmod -R 775 storage/
Ответ 10
Убедитесь, что на вашем веб-сервере установлено правильное системное время. В моем случае бродячая машина была в будущем (26 января 14:08:26 UTC 2226), поэтому, конечно, время в моем файле cookie сеанса браузера истекло несколько 200+ лет назад.
Ответ 11
У меня было приложение с несколькими субдоменами, и проблема с сеансом cookie была проблемой между ними. Очистка куки файлов разрешила мою проблему.
Также попробуйте установить SESSION_DOMAIN
в файле .env. Используйте точный субдомен, который вы просматриваете.
Ответ 12
set mbstring.func_overload = 2
это помогло мне
Ответ 13
Я нашел два решения, чтобы избежать этой ошибки: 1) добавив защищенный $ кроме = ['/yourroute'] возможное отключение проверки токена csrf из определенного корня. 2) просто прокомментируйте строку \App\Http\Middleware\VerifyCsrfToken :: class в группе защищенного промежуточного ПО в ядре
Ответ 14
У меня была такая же проблема, но проблема не в фреймворке, а в браузере. Я не знаю почему, но в моем случае Google Chrome блокирует куки автоматически. После разрешенных куки проблема была решена.
Ответ 15
Краткий ответ
Добавьте запись маршрута для register
в app/Http/Middleware/VerifyCsrfToken.php
protected $except = [
'/routeTo/register'
];
и очистите кеш и маршрут кеша с помощью команд:
php artisan cache:clear && php artisan route:clear
Подробнее
Каждый раз, когда вы заходите на сайт Laravel, генерируется токен, даже если сеанс не был запущен. Затем в каждом запросе этот токен (хранящийся в файлах cookie) будет проверяться по времени его истечения, установленному в поле SESSION_LIFETIME
в файле config/session.php
.
Если вы оставляете сайт открытым дольше срока действия и пытаетесь сделать запрос, этот токен будет оценен, и ошибка срока действия вернется. Таким образом, чтобы пропустить эту проверку в формах, которые находятся за пределами функций аутентифицированных пользователей (таких как регистрация или вход в систему), вы можете добавить маршрут исключения в app/Http/Middleware/VerifyCsrfToken.php
.
Ответ 16
Вы должны иметь тип файла
FileName.blade.php
в laravel
FileName.erb.rb
в Ruby и Rails
и добавить любой
-
{{ csrf_token() }}
-
<input type="hidden" name="_token" value="{{ csrf_token() }}" >
-
<meta name="csrf-token" content="{{ csrf_token() }}">