Я установил Laravel 5.7
Добавил форму в файл \resources\views\welcome.blade.php
<form method="POST" action="/foo" >
@csrf
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
</form>
Добавлено в файл \routes\web.php
Route::post('/foo', function () {
echo 1;
return;
});
После отправки запроса POST:
419 К сожалению, срок вашего сеанса истек. Обновите страницу и попробуйте еще раз.
В версии 5.6
такой проблемы не было.
return;
можно позвонитьreturn redirect()->back();
. Насколько я могу судить, приложению нечего делать после почтового запроса. Возможно, вы сможете перенаправить его в представление после обработки запроса.file
наSESSION_DRIVER
в.env
это работает отлично. Почему не работает сеанс на основе базы данных.vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php
строка 67, чтобы узнать почемуsessions
стол для другой цели. После изменения имени этой таблицы на более подходящее, а также выполненияartisan session:table
и обновления миграции, все работает нормальноОтветы:
Перед чтением ниже убедитесь, что у вас есть
@csrf
или{{ csrf_field() }}
в вашей форме нравится<form method="post"> @csrf <!-- {{ csrf_field() }} --> ... rest of form ... </form>
Сообщение об ошибке Session Expired или 419 Page Expired в larvel появляется из-за того, что где-то не удается проверить ваш токен csrf, что означает, что
App\Http\Middleware\VerifyCsrfToken::class
промежуточное ПО уже включено. В форме@csrf
уже добавлена директива blade, что тоже должно быть хорошо.Затем другая область для проверки - это сеанс.
csrf
Маркер проверка непосредственно связана с вашей сессией, поэтому вы можете проверить , является ли драйвер сеанса работой или нет, например, неправильно настроенного Redis может вызвать проблемы.Возможно, вы можете попробовать переключить драйвер / программное обеспечение сеанса из
.env
файла, поддерживаемые драйверы приведены ниже.Поддерживаемые драйверы сеансов в Laravel 5, Laravel 6 и Laravel 7 (Doc Link)
file
- сеансы хранятся в хранилище / framework / sessions.cookie
- сеансы хранятся в безопасных зашифрованных файлах cookie.database
- сеансы хранятся в реляционной базе данных.memcached
/redis
- сеансы хранятся в одном из этих быстрых хранилищ на основе кеша.array
- сеансы хранятся в массиве PHP и не сохраняются.Если ваша форма работает после переключения драйвера сеанса, значит, что-то не так с этим конкретным драйвером, попробуйте исправить ошибку оттуда.
Возможные сценарии, подверженные ошибкам
Вероятно, сеансы на основе файлов могут не работать из-за проблем с правами доступа к
/storage
каталогу (быстрый поиск в Google даст вам решение), также помните, что установка 777 для каталога никогда не является решением.В случае с драйвером базы данных ваше соединение с БД может быть неправильным, или
sessions
таблица может не существовать или неправильно настроена (неправильная часть конфигурации была подтверждена как проблема в соответствии с комментарием @Junaid Qadir).redis/memcached
конфигурация неверна или одновременно обрабатывается другим фрагментом кода в системе.Было бы неплохо выполнить
php artisan key:generate
и сгенерировать новый ключ приложения, который, в свою очередь, сбрасывает данные сеанса.Очистить кеш браузера СЛОЖНО , я обнаружил, что хром и firefox виноваты больше, чем я могу вспомнить.
Подробнее о том, почему важны ключи приложения
источник
_token
значением из FORM. Избегайте использованияSESSION_DOMAIN=...
IP-адресов, которые в спецификациях Chrome и HTTP Cookie считаются небезопасными.419 Page Expired
. Для удобства использования, как рассказать простому пользователю о том, что только что произошло, и как это решить?Это потому, что форма требует csrf. В версии 5.7 поменяли на @csrf
<form action="" method="post"> @csrf ...
Референт: https://laravel.com/docs/5.7/csrf
источник
csrf
поле, я только что заглянул в историю редактированиятогда
добавьте
SESSION_DOMAIN=
в свой файл .envили в вашем config / session.php
'domain' => env('SESSION_DOMAIN', ''),
а затем запустить
php artisan cache:clear
добавьте
SESSION_DOMAIN=mydomain.com
в свой файл .envили в вашем config / session.php
'domain' => env('SESSION_DOMAIN', 'mydomain.com'),
а затем запустить
php artisan cache:clear
источник
Как насчет использования
{{ csrf_field() }}
вместо того@csrf
Ошибка 419 в основном связана с проблемами с токеном csrf.
источник
{{ csrf_field() }}
?Я использую Laravel 5.7, у меня была такая же проблема, потому что токен csrf не был в форме, поэтому добавление
исправил проблему
источник
Попробуйте прокомментировать,
\App\Http\Middleware\EncryptCookies::class
у\app\Http\Kernel.php
меня есть аналогичная проблема, и я решил ее таким образом. Наверное, не лучшее решение из-за безопасности, но, по крайней мере, оно работало.Раньше я пробовал:
\App\Http\Middleware\VerifyCsrfToken::class
в\app\Http\Kernel.php
\Illuminate\Session\Middleware\AuthenticateSession::class
в\app\Http\Kernel.php
Но ничего из вышеперечисленного не помогло мне.
РЕДАКТИРОВАТЬ
В моем случае каждый раз, когда я вхожу в систему, создается новый файл сеанса (старый все еще сохраняется, но внезапно забывается. Проверьте
storage/framework/sessions
) и генерируется новый токен CSRF. Так что проблема не в VerifyCsrfToken.Как @Vladd упомянул в разделе комментариев, вы никогда не должны комментировать
\App\Http\Middleware\VerifyCsrfToken::class
. Вы должны убедиться, что отправили правильный CSRF TOKEN на сервер.источник
измените свой
@csrf
в welcome.blade.php на<input type="hidden" name="_token" value="{{ csrf_token() }}">
так что ваш код такой:
<form method="POST" action="/foo" > <input type="hidden" name="_token" value="{{ csrf_token() }}"> <input type="text" name="name"/><br/> <input type="submit" value="Add"/> <button type="submit">Submit</button> </form>
источник
Это может быть проблема с вашей сессией. Поигравшись с этими настройками, я решил свою проблему. Для меня это оказался последний вариант.
Источник: Laravel Session всегда изменяет каждое обновление / запрос в Laravel 5.4.
источник
SESSION_SECURE_COOKIE
переключатель (поменял его наfalse
) сделал это за меня. (onlocalhost:8000
)добавьте токен csrf и ваша проблема будет решена. {{csrf_token}} или @csrf
источник
Чтобы решить эту ошибку, вам сначала нужно вставить одну из следующих команд в тег формы.
@csrf
ИЛИ{{ csrf_field }}
Если проблема не решена, сделайте следующее: (Обратите внимание, что одна из приведенных выше команд должна быть в теге формы)
1. Вставьте одну из следующих команд в тег формы
@csrf
ИЛИ{{ csrf_field }}
2. Откройте файл .env и измените значения на «файл» в разделе SESSION_DRIVER.
3. Затем вам следует сбросить кеш laravel. введите ниже команды в терминале
php artisan view:clear
php artisan route:clear
php artisan cache:clear
php artisan config:cache
4. На последнем этапе отключите проект от сервера и снова нажмите на php artisan serve.
Надеюсь твоя проблема решена
источник
Спустя столько времени я решил это таким образом
Мой путь установки laravel не совпадал с указанным в конфигурационном файле session.php
'domain' => env('SESSION_DOMAIN', 'example.com'),
источник
Это может показаться излишним, но вы можете попробовать следующее:
// Форма вызова именованного маршрута с добавленным полем скрытого токена.
<form method="POST" action="{{ route('foo') }}" > @csrf <input type="hidden" name="_token" value="{!! csrf_token() !!}"> <input type="text" name="name"/><br/> <input type="submit" value="Add"/> </form>
// Именованный маршрут
Route::post('/foo', function () { return 'bar'; })->name('foo');
// Добавьте это в
<head></head>
блок:<meta name="_token" content="{!! csrf_token() !!}" />
Я тестировал его на своем локальном компьютере, используя Homestead на Laravel 5.7, который был свежей установкой с использованием Laravel Installer 2.0.1, и он работал. Какая у вас среда?
Теория: мне интересно, связано ли это с рендерингом HTML-тегов лезвия с
{{ }}
vs.{!! !!}
в вашей среде или с тем, как вы ее обслуживаете (напримерphp artisan serve
). Что заставляет меня думать, что isline 335
of/vendor/laravel/framework/src/illuminate/Foundation/helpers.php
должен отображать ту же строку, введенную вручную выше.источник
<meta>
теги нужно размещать внутри<head>
, а не внутри<body>
. Я не уверен, что валидатору HTML это понравится.В коде нет проблемы. Я проверил тот же код, что и вы, при новой установке.
Код формы:
<form method="POST" action="/foo" > @csrf <input type="text" name="name"/><br/> <input type="submit" value="Add"/> </form>
web.php
код файла:Route::get('/', function () { return view('welcome'); }); Route::post('/foo', function () { echo 1; return; });
Результат после отправки формы:
Если вы очистите кеш браузера или попытаетесь использовать другой браузер, я думаю, это будет исправлено.
источник
Быстрый плохой подход - перейти в app \ http \ middleware \ verifycsrftoken.php и добавить маршрут в список $ except. Почтовый запрос будет проигнорирован для проверки токена CSRF.
protected $except = [ // 'doLogin.aspx', 'create_coupon', ];
источник
419 | страница эта ошибка означает проблему безопасности laravel, это означает, что поле токена csrf используется неправильно.
используйте
{{csrf_field}}
и ваша проблема будет решена.источник
Это должно сработать, если вы попробуете все эти шаги:
Убедитесь, что ваш сеанс правильно настроен, самый простой способ - сделать его файлом и убедиться, что папка хранения имеет разрешение chmod 755, а затем
.env
вы установите его, как показано ниже, драйвер сеанса файла - самый простой способ установить.SESSION_DRIVER=file SESSION_DOMAIN= SESSION_SECURE_COOKIE=false
Убедитесь, что папка кэша очищена и доступна для записи, вы можете сделать это, выполнив команду artisan ниже.
Убедитесь, что права доступа к папке установлены правильно, они должны быть настроены, как показано ниже:
sudo chmod -R 755 storage sudo chmod -R 755 vendor sudo chmod -R 644 bootstrap/cache
Убедитесь, что в вашей форме есть
@csrf
токен.Надеюсь, это решит вашу проблему.
источник
В твоем
Http/Kernel.php
попробуйте прокомментировать эту строку:
\Illuminate\Session\Middleware\AuthenticateSession::class,
в вашем веб-массиве промежуточного программного обеспечения
это может быть корнем вашей проблемы
источник
По умолчанию у меня не было этой проблемы. Я
chmod -R 644 sessions
воспроизвел проблему.Впоследствии я дал разрешения на папку сессий
chmod -R 755 sessions
теперь мой код проекта снова работает.
Причина, по которой это происходит, заключается в том, что вы храните кеш в файле с отсутствием разрешений на запись.
Решения:
1 - Как я исправил выше, вы можете дать 755 разрешений для папки сессий. 2 - Вы можете использовать другую конфигурацию драйвера сеанса.
Имей в виду; Если вы хотите использовать memcached / redis, вам необходимо, чтобы они были установлены на вашем сервере, или ваш контейнер docker redis должен быть запущен.
источник
Фактически CSRF - это токен на основе сеанса. Добавьте свой маршрут в группу маршрутов и добавьте промежуточное ПО, которое контролирует сеансы.
web - это промежуточное ПО по умолчанию в laravel, которое может управлять запросами сеанса.
Route::group(array('middleware' => ['web']), function () { Route::post('/foo', function () { echo 1; return; }); });
источник
Если у вас уже есть директива csrf , возможно, вы изменили способ запуска сеансов.
В
config/session.php
, проверьте поле "безопасный" . Он должен быть включен, если https недоступен на вашем сервере.Вы также можете поместить
SESSION_SECURE_COOKIE=FALSE
в свой.env
файл (корневой каталог).источник
откройте командную строку cmd в своем проекте.
1. команда
2. команда
источник
У вас тоже есть csrf в шапке вашего приложения?
<meta name="csrf-token" content="{{ csrf_token() }}">
источник
Хотя форма есть
@csrf
, она все еще показывает419 pages has expired
Я решил это после
SESSION_SECURE_COOKIE
параметра обновления false в config / session.php'secure' => env('SESSION_SECURE_COOKIE', false)
чем очистить кеш
источник
Перейдите в config / sessions.php
найди строку
'secure' => env('SESSION_SECURE_COOKIE', true),
измените его на false
'secure' => env('SESSION_SECURE_COOKIE', false),
Если для этого параметра установлено значение ИСТИНА, браузер потребует от вас использовать протокол HTTPS, в противном случае он не будет сохранять сеанс. Поскольку это недействительно
источник
Я просто просмотрел это и задержался здесь в поисках ответа. В моем случае решением было очистить историю браузера.
источник
В моем случае?> В конце routes.php. Провел там много времени ...
источник
?>
в конецweb.php
У меня была точно такая же проблема, и я был совершенно глуп. Я отключил все поля формы (а не только кнопку отправки) с помощью javascript перед отправкой указанной формы! Это, конечно, привело к тому, что все элементы формы не были отправлены (включая скрытое
_token
поле), что, в свою очередь, привело к ошибке 419!Надеюсь, это поможет кому-то от нескольких часов чесания головы!
Отключенные поля формы не отображаются в запросе
источник
У меня эта проблема возникла давно. Я вспомнил, что это вызывает разрешение
storage/framework/sessions
. Вы можете изменить его поchmod -R 0777 storage/framework/sessions
команде. У меня это сработало.источник
В моем случае это очень смешно. Я получаю ошибку 419, когда помещаю
Auth::routes()
в начало файла маршрута.Auth::routes(); Route::middleware('auth')->group(function () { Route::get('/', 'DashboardController@index')->name('dashboard'); });
И я исправил ошибку, переместившись
Auth::routes();
в конец файла маршрута.Route::middleware('auth')->group(function () { Route::get('/', 'DashboardController@index')->name('dashboard'); }); Auth::routes();
Может быть, это поможет и твоему делу. Удачи.
источник
Обратите внимание, что вы получаете ошибку 419, если пытаетесь загрузить большой файл, размер которого превышает ограничение на размер почтового файла. В этом случае вы можете увеличить как upload_max_filesize, так и post_max_size до разумной суммы (например, 10M или 20M в зависимости от вашего варианта использования и ресурсов), проверьте здесь: https://stackoverflow.com/a/2184541/2100489
Но это может вызвать проблемы с потреблением ресурсов, например полосы пропускания и хранилища. В качестве решения вы можете проверить размер файла перед отправкой формы и показать предупреждающее сообщение.
источник