Отправить запрос в Laravel - Ошибка - 419 Извините, ваша сессия / 419 ваша страница истекла

Я установил 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 Sorry, your session has expired. Please refresh and try again.

В версии 5.6 такой проблемы не было.

Вы пробовали добавить редирект? Вместо return; можно вызвать return redirect()->back();. Насколько я могу судить, приложению нечего делать после почтового запроса. Возможно, вы сможете перенаправить его в представление после обработки запроса.

dcangulo 01.10.2018 04:57

У меня такая же проблема. Когда я переключаюсь на сеанс базы данных, это происходит, и когда я возвращаюсь к file для SESSION_DRIVER в .env, он работает нормально. Почему не работает сеанс на основе базы данных.

Junaid Qadir Shekhanzai 05.11.2018 12:14

Я скопировал ваш точный код в новую установку laravel 5.7. Это сработало. Проблема в другом.

Kyle Wardle 06.11.2018 12:37

эта проблема из-за проблемы с токеном. Я пытался запустить такой же код, но без ошибок. Вы должны предоставить больше информации, например, о вашем драйвере сеанса, отображении значения _token в форме. Кроме того, вы можете отладить себя в этом файле vendor/laravel/framework/src/Illuminate/Foundation/Http/Midd‌​leware/VerifyCsrfTok‌​en.php, строка 67, чтобы узнать, почему

bangnokia 06.11.2018 19:37

Я понял, что использовал стол sessions для другой цели. После изменения имени этой таблицы на более подходящее, запуска artisan session:table и обновленной миграции все работает нормально.

Junaid Qadir Shekhanzai 07.11.2018 06:35

Я проверил ваш код и не обнаружил никаких проблем. Предупреждающего сообщения не было, а эхо-сигнал 1 был точным. Я также использую laravel 5.7

Md. Harun Or Rashid 09.11.2018 09:29

Предполагается, что сеансы истекают, поэтому просто проверьте очевидный вопрос - как долго была открыта форма, прежде чем вы ее отправили? Какое значение имеет lifetime в config/session.php?

Don't Panic 11.11.2018 12:03

Поскольку автор ОП не вмешался и не сказал, что решило его проблему. Я вижу здесь множество решений, которые не решили мою проблему. Я решил это по-другому, поэтому я думаю, что ни один ответ не является правильным. Все они могут быть правильными в разных сценариях. Следовательно, я держу свое предложение о вознаграждении.

Junaid Qadir Shekhanzai 13.11.2018 07:19

Вы можете добавить ответ, который решил вашу проблему, если он не упоминается здесь в каких-либо ответах (потому что это не имеет смысла). И в соответствии с тем, какой ответ вам понравился больше всего / больше подходит для будущих OP, вы можете наградить награду. потому что вы не можете получить обратно награды ни при каких обстоятельствах

Shobi 13.11.2018 08:33
stackoverflow.com/questions/37806762/…
Sahal 03.11.2020 12:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
111
11
253 199
48

Ответы 48

Это потому, что для формы требуется csrf. В версии 5.7 поменяли на @csrf

<form action = "" method = "post">
    @csrf
    ...

Референт: https://laravel.com/docs/5.7/csrf

Его форма включает токен csrf. Не уверен, редактировал он это позже или нет.

eResourcesInc 10.10.2018 05:30

да, в его форме изначально есть поле csrf, я только что заглянул в историю редактирования

Dexter Bengil 07.11.2018 10:39

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

Sami 14.12.2020 12:49

даже с установленным csrf я получаю ту же ошибку ...

nassim 01.06.2021 20:57

У меня была точно такая же проблема, и я был совершенно глуп. Я отключил все поля формы (а не только кнопку отправки) через javascript перед отправкой указанной формы! Это, конечно, привело к тому, что все элементы формы не были отправлены (включая скрытое поле _token), что, в свою очередь, привело к ошибке 419!

Надеюсь, это поможет кому-то от нескольких часов чесания головы!

Отключенные входные данные формы не отображаются в запросе

Как насчет использования

{{ csrf_field() }} вместо @csrf

Ошибка 419 в основном связана с проблемами с токеном csrf.

Вы имеете ввиду {{ csrf_field() }}?

Travis Britz 06.11.2018 12:45

Он генерирует тот же html, что и @csrf, с таким же результатом

Sami 14.12.2020 12:52

В вашем Http/Kernel.php

попробуйте прокомментировать эту строку:

\Illuminate\Session\Middleware\AuthenticateSession::class,

в вашем веб-массиве промежуточного программного обеспечения

это может быть корнем вашей проблемы

Это может показаться излишним, но вы можете попробовать следующее:

// Форма вызова маршрута названный с добавленным полем скрытого токена.

<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-тегов лезвиями с {{ }} по сравнению с {!! !!} в вашей среде или с тем, как вы ее обслуживаете (например, php artisan serve). Что заставляет меня думать, что line 335 из /vendor/laravel/framework/src/illuminate/Foundation/helpers.php должен отображать ту же строку, введенную вручную выше.

Да, круто, но теги <meta> следует размещать внутри <head>, а не внутри <body>. Я не уверен, что валидатору HTML это понравится.

emix 09.11.2018 08:20

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

jeremykenedy 09.11.2018 08:23

У меня тоже была такая проблема, и я обнаружил, что файлы сеанса заблокированы для записи. Итак, я не знаю, запускаете ли вы свой Laravel через такие вещи, как vagrant или Docker, но я советую вам попробовать изменить права каталога сеанса (и, конечно, файлов) (когда вы запускаете Laravel на виртуальной машине, вы должны изменить права локально и в виртуальной машине (например, когда вы делитесь файлами через NFS)

Нравится:

chmod -R 777 storage/framework/sessions
chmod -R 777 storage/logs

Я знаю, разрешение 777 - худшая катастрофа, которую вы можете себе представить. Но они удобны для устранения неполадок.

Чтобы быть уверенным, что я никогда этого не забуду, я сделал bash-скрипт. (Назвал его lalog, просто потому, что я хотел очистить файлы журнала и установить разрешения)

Примечание: Убедитесь, что вы используете это в каталоге сеанса. В config / session.php объявлен ключ files с указанием местоположения. В моем случае:

<?php
//...........
'files' => storage_path('framework/sessions'),
//...........

Расположение: / usr / bin / lalog (Это файл, а не каталог)
Выполнить в оболочке как lalog

#!/bin/bash
rm -rf /home/username/Projects/x/storage/logs/laravel.log
echo "Laravel log removed"
touch /home/username/Projects/x/storage/logs/laravel.log
echo "Laravel log created"
chmod -R 777 /home/username/Projects/x/storage/
echo "CHMOD 777 on Storage dir"

Предупреждение! Это предоставит доступ для записи всем, так что будьте осторожны! Также, возможно, в файле журнала Laravel есть некоторая полезная информация. (обязательно загляните в этот файл журнала перед запуском моего сценария bash)

Кроме того, я знаю, что это уже упоминалось. Но будьте абсолютно уверены, что вы всегда

  1. Разрешить файлы cookie в браузере, чтобы токен можно было установить в файлах cookie.
  2. Проверьте, используете ли вы @csrf в своем блейд-файле.

Форма должна быть примерно такой

<form method = "POST" action = "{{ route('login') }}">
@csrf
.......
</form>

Вы не можете сделать пустой возврат на Laravel 5.6 или выше. Laravel всегда ожидает возврата значения. (Знаю по прошлому опыту). В основном это связано с тем, как PHP 7 обрабатывает пустые возвраты.

Вы неправильно добавили поле CSRF. Вместо @csrf вы должны использовать csrf_field() вот так:

<form method = "POST" action = "/foo" >
    {{ csrf_field() }}
    <input type = "text" name = "name"/><br/>
    <input type = "submit" value = "Add"/>
</form>

В коде нет проблем. Я проверил тот же код, что и вы, при новой установке.

Код формы:

<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;
});

Результат после отправки формы: Output after submitting the form

Если вы очистите кеш браузера или попытаетесь использовать другой браузер, я думаю, это будет исправлено.

Быстрый плохой подход - перейти в app \ http \ middleware \ verifycsrftoken.php и добавить маршрут в список $ except. Почтовый запрос будет проигнорирован для проверки токена CSRF.

protected $except = [
    //
    'doLogin.aspx',
    'create_coupon',
];

На самом деле CSRF - это токен на основе сеанса. Добавьте свой маршрут в группу маршрутов и добавьте промежуточное ПО, которое управляет сеансами.

web - это промежуточное ПО по умолчанию в laravel, которое может управлять запросами сеанса.

Route::group(array('middleware' => ['web']), function () {
  Route::post('/foo', function () {
     echo 1;
     return;
  });
});

Перед чтением ниже убедитесь, что у вас есть @csrf или {{ csrf_field() }} в вашей форме. нравиться

<form method = "post">
@csrf <!-- {{ csrf_field() }} -->
... rest of form ...
</form>

Сообщение об ошибке Session Expired или 419 Page Expired в Laravel появляется, потому что где-то происходит сбой проверки вашего токена csrf, что означает, что промежуточное ПО App\Http\Middleware\VerifyCsrfToken::class уже включено. В форме уже добавлена ​​директива лезвия @csrf, что тоже должно быть хорошо.

Затем другая область для проверки - это сеанс. Проверка токена csrf напрямую связана с вашим сеансом, поэтому вы можете проверить, работает ли ваш драйвер сеанса или нет, например, неправильно настроенный Redis может вызвать проблему.

Возможно, вы можете попробовать переключить драйвер / программное обеспечение сеанса из файла .env, поддерживаемые драйверы приведены ниже.

Поддерживаемые драйверы сессий в Laravel 5, Laravel 6 и Laravel 7(Ссылка на документ)

  • file - сессии хранятся в хранилище / framework / sessions.
  • cookie - сеансы хранятся в безопасных зашифрованных файлах cookie.
  • database - сеансы хранятся в реляционной базе данных.
  • memcached / redis - сеансы хранятся в одном из этих быстрых хранилищ на основе кеша.
  • array - сеансы хранятся в массиве PHP и не сохраняются.

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

Возможные сценарии с высокой вероятностью ошибок

  • Вероятно, сеансы на основе файлов могут не работать из-за проблем с разрешениями в каталоге /storage (быстрый поиск в Google даст вам решение), также помните, что установка 777 для каталога никогда не является решением.

  • В случае драйвера базы данных ваше соединение с БД может быть неправильным, или таблица sessions может не существовать или неправильно настроена (неправильная часть конфигурации была подтверждена как проблема в соответствии с комментарием @Junaid Qadir).

  • Конфигурация redis/memcached неверна или одновременно обрабатывается другим фрагментом кода в системе.

Было бы неплохо выполнить php artisan key:generate и сгенерировать новый ключ приложения, который, в свою очередь, сбрасывает данные сеанса.

Очистить кеш браузера ЖЕСТКИЙ, я обнаружил, что Chrome и Firefox виноваты больше, чем я могу вспомнить.

Узнайте больше о том, почему важны ключи приложений

Иногда просто браузеры, в основном Chrome, не помещают значение сеанса Set-Cookie, потому что оно искажено или нестандартно. Таким образом, Laravel не найдет никакого существующего значения сеанса из HTTP-запроса для сравнения с полученным значением _token из FORM. Избегайте использования SESSION_DOMAIN=... с IP, который Chrome и Спецификации файлов cookie HTTP считают небезопасным.

KeitelDOG 07.12.2018 16:54

У меня такая же проблема, но я не получаю сообщение об ошибке постоянно. Просто время от времени это происходит. Думаю, это означает, что с драйвером сеанса проблем нет, потому что он работает 99% времени. Но я использую живое приложение и время от времени получаю жалобы от клиентов. Однако это очень редко. Я использую драйвер файлового сеанса. Кто-нибудь знает, почему это происходит в моем случае? Спасибо

Angel Miladinov 11.09.2019 17:45

@ TheAngelM97 Вы можете легко воспроизвести эту ошибку, перейдя либо на страницу входа в систему, либо на страницу регистрации. Не делайте ничего больше 30 минут. Затем, когда вы нажимаете на «Отправить», появляется 419 Page Expired. Для удобства использования, как рассказать простому пользователю о том, что только что произошло, и как это решить?

Pathros 08.06.2020 18:55

По умолчанию у меня не было этой проблемы. Итак, что я сделал, это chmod -R 644 sessions воспроизвести проблему.

Впоследствии я дал разрешения на папку сессий с помощью chmod -R 755 sessions

теперь мой код проекта снова работает.

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

The session configuration file is stored at config/session.php. Be sure to review the options available to you in this file. By default, Laravel is configured to use the file session driver, which will work well for many applications. In production applications, you may consider using the memcached or redis drivers for even faster session performance.

Решения:

1 - Как я исправил выше, вы можете дать 755 разрешений для папки сессий. 2 - Вы можете использовать другую конфигурацию драйвера сеанса.

file - sessions are stored in storage/framework/sessions. cookie - sessions are stored in secure, encrypted cookies. database - sessions are stored in a relational database. memcached / redis - sessions are stored in one of these fast, cache based stores. array - sessions are stored in a PHP array and will not be persisted.

Имей в виду; Если вы хотите использовать memcached / redis, вам необходимо, чтобы они были установлены на вашем сервере, или ваш контейнер docker redis должен быть запущен.

У меня была аналогичная проблема, и я нашел решение этого

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

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

На самом деле это ничего не добавляет к существующим ответам.

haldo 15.12.2018 03:32

Попробуйте закомментировать \App\Http\Middleware\EncryptCookies::class в \app\Http\Kernel.php У меня похожая проблема, и я решил ее. Наверное, не лучшее решение из-за безопасности, но, по крайней мере, оно работало.

Раньше я пробовал:

  • Очистить кэш
  • Создать новый ключ приложения
  • Запустить мое приложение в различных браузерах (Chrome 70, Mozilla Firefox 57 и IE 11)
  • Запустить мое приложение на другом компьютере
  • Прокомментируйте \App\Http\Middleware\VerifyCsrfToken::class в \app\Http\Kernel.php
  • Прокомментируйте \Illuminate\Session\Middleware\AuthenticateSession::class в \app\Http\Kernel.php
  • Обновите и понизьте версию Laravel (между 5.6 и 5.7)

Но ничего из вышеперечисленного у меня не сработало.

РЕДАКТИРОВАТЬ

В моем случае каждый раз, когда я вхожу в систему, создается новый файл сеанса (старый файл все еще сохраняется, но внезапно забывается. Проверьте storage/framework/sessions) и генерируется новый токен CSRF. Так что проблема не в VerifyCsrfToken.

Как @Vladd упомянул в разделе комментариев, вы должны никогда закомментировать \App\Http\Middleware\VerifyCsrfToken::class. Вы должны убедиться, что отправили правильный CSRF TOKEN на сервер.

Среди упомянутых вами способов у меня сработало только комментирование \ App \ Http \ Middleware \ VerifyCsrfToken :: class в \ app \ Http \ Kernel.php.

Lex Soft 21.02.2019 16:25

Очистить кеш, создать новый ключ приложения + удалить файлы cookie

dobs 01.04.2019 15:41

Вы никогда не должны изменять класс \ App \ Http \ Middleware \ VerifyCsrfToken :: class. Почему ты бы так поступил? Чтобы создать себе слабое место в приложении?

Vladd 23.05.2019 04:43

@dobs Спасибо за добавление '+ Remove Cookies', потому что я получал ошибку 419 даже после того, как сделал все, что мог, и это сработало только тогда, когда я очистил куки браузера / попробовал в инкогнито.

Niraj Pandey 03.07.2019 17:59

Просто скажу, что у меня были те же проблемы. В моей местной усадьбе он будет работать, как ожидалось, но после отправки на сервер разработки я также получил сообщение о тайм-ауте сеанса. Поняв, что это проблема с окружающей средой, я перешел с apache на nginx, и это чудесным образом решило проблему.

Я использую Laravel 5.7 У меня была такая же проблема, потому что токен csrf не был в форме, поэтому добавление

@csrf

исправил проблему

case 1 : if you are running project in your local system like 127.0.01:8000 ,

тогда

добавьте SESSION_DOMAIN= в ваш файл .env

или в вашем config / session.php 'domain' => env('SESSION_DOMAIN', ''),

а затем запустите php artisan cache:clear

case 2: if project is running on server and you have domain like "mydomain.com"

добавьте SESSION_DOMAIN=mydomain.com в ваш файл .env

или в вашем config / session.php 'domain' => env('SESSION_DOMAIN', 'mydomain.com'),

а затем запустите php artisan cache:clear

мне помогло, спасибо!

mishaikon 07.06.2021 15:21

измените свой @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>

У меня эта проблема возникла давно. Я вспомнил, что это вызывает разрешение storage/framework/sessions. Вы можете изменить его с помощью команды chmod -R 0777 storage/framework/sessions. У меня это сработало.

Просто измените .env

SESSION_DRIVER=cookie

Спустя столько времени я решил это таким образом

Мой путь установки laravel не совпадал с указанным в файле конфигурации session.php

'domain' => env('SESSION_DOMAIN', 'example.com'),

В моем случае это очень смешно. Я получаю ошибку 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

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

419 | страница эта ошибка означает проблему безопасности laravel, это означает, что поле токена csrf используется неправильно.

использовать {{csrf_field}} и ваш вопрос будет решен.

добавьте токен csrf и ваша проблема будет решена. {{csrf_token}} или @csrf

Это может быть проблема с вашей сессией. Поигравшись с этими настройками, я решил свою проблему. Для меня это оказался последний вариант.

  • Если вы используете "файл" в качестве драйвера сеанса, посмотрите storage / framework / sessions, если сеансы сохраняются после обновить. В противном случае это, скорее всего, из-за неправильной папки разрешения. Убедитесь, что ваше хранилище / папка правильно
  • Попробуйте отключить весь Javascript на своих страницах (либо отключив его через навигатор или внутри кода) и убедитесь, что 'http_only' => правда,
  • Попробуйте использовать с https и без него
  • Убедитесь, что переменная SESSION_DRIVER НЕ равна нулю
  • Попробуйте переключиться между 'encrypt' => false и 'encrypt' => true,
  • Попробуйте изменить имя файла cookie 'cookie' => 'laravelsession',
  • Попробуйте либо установить для вашего SESSION_DOMAIN ваш фактический домен, либо null
  • Попробуйте переключиться между 'secure' => env ('SESSION_SECURE_COOKIE', false) и 'secure' => env ('SESSION_SECURE_COOKIE', true),

Источник: Сессия Laravel всегда изменяет каждое обновление / запрос в Laravel 5.4

Да, после многих других попыток переключатель SESSION_SECURE_COOKIE (поменял его на false) сделал это за меня. (на localhost:8000)

Marten Koetsier 03.11.2019 13:56

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

Bram Janssen 04.11.2019 18:12

для меня он работает с https, но не с http ... любая идея, почему? спасибо за отличный ответ, мне потребовались часы, чтобы найти его.

sharkyenergy 17.04.2020 09:39

Я просто хочу сказать, убедитесь, что токен csrf сгенерирован, иногда это просто пустой массив, например, в форме повторителя, если вы не генерируете внутри js-запроса.

Если у вас уже есть директива csrf, возможно, вы изменили способ запуска сеансов.

В config/session.php проверьте поле 'безопасный'. Он должен быть установлен на false, если https недоступен на вашем сервере.

Вы также можете поместить SESSION_SECURE_COOKIE=FALSE в ваш файл .env (корневой каталог).

У меня была такая же проблема в моей среде разработки. Это было решено с использованием http://127.0.0.1:8000 вместо http://localhost:8000.

В моем случае удаление bootstrap/cache устранило проблему.

Для меня ошибка возникает, когда сеанс становится недействительным, и пользователь пытается отправить почтовый запрос. Csrf_token больше не действительны. поэтому я преодолеваю это, изменяя Handler.php в каталоге исключений и пытаюсь поймать исключение несоответствия токена, подобное этому.

Функция рендеринга была такой

public function render($request, Exception $exception)
{
    return parent::render($request, $exception);
}

Затем я модифицирую его, чтобы он выглядел так

public function render($request, Exception $exception)
{

    if ($exception instanceof \Illuminate\Session\TokenMismatchException){ // <<<=========== the Code
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }

        return redirect('/home')->with('message', 'You page session expired. Please try again');
    }
    return parent::render($request, $exception);
}

Просто вы выбираете маршрут, который может обрабатывать операцию обновления токена.

Чтобы решить эту ошибку, вам сначала нужно вставить одну из следующих команд в тег формы.

@csrf ИЛИ {{ csrf_field }}

Если ваша проблема не решена, сделайте следующее: (Обратите внимание, что одна из вышеперечисленных команд должна быть в теге формы)

1. вставьте одну из следующих команд в тег формы @csrf ИЛИ {{ csrf_field }}

2. Откройте файл .env и измените значения на «файл» в разделе SESSION_DRIVER.

3. Затем вам следует сбросить кеш laravel. введите ниже команды в терминале

php artisan view:clearphp artisan route:clearphp artisan cache:clear

php artisan config:cache

4. На последнем этапе отключите проект от сервера и снова нажмите на php artisan serve.

Надеюсь твоя проблема решена

Добавьте в свою форму на .blade.php файл {{ csrf_field() }} или @csrf вот так

<form method='POST' action='route("exampleRoute")'>
   {{ csrf_field() }} or @csrf
   ....
   ....
</form>

Чем отличается ваш ответ от существующих ответов?

Shobi 28.06.2020 20:51

откройте командную строку cmd в вашем проекте.

1. команда

php artisan config:cache

2. команда

php artisan route:clear

У вас тоже есть csrf в шапке вашего приложения?

<meta name = "csrf-token" content = "{{ csrf_token() }}">

какая-то строка кода в app / Exceptions / Handler.php решила мою проблему.

public function render($request, Exception $exception)
{
    if ($exception instanceof Illuminate\Session\TokenMismatchException) {
        Artisan::call('cache:clear');
        Artisan::call('config:cache');
        return Redirect::back();
    }
    return parent::render($request, $exception);
}

в моем случае другой пользователь-администратор вошел в систему с моей админ-панелью и не может войти в систему с новым laravel / ui auth и 419 уволен.

Решение:

используйте вкладку инкогнито и откройте новую вкладку, а затем проверьте ее снова.

Это должно сработать, если вы попробуете все эти шаги:

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

    SESSION_DRIVER=file
    SESSION_DOMAIN=
    SESSION_SECURE_COOKIE=false
    
  2. Убедитесь, что папка Cache очищена и доступна для записи, вы можете сделать это, выполнив команду artisan ниже.

    php artisan cache:clear
    
  3. Убедитесь, что права доступа к папке установлены правильно, они должны быть настроены, как показано ниже:

    sudo chmod -R 755 storage
    sudo chmod -R 755 vendor
    sudo chmod -R 644 bootstrap/cache
    
  4. Убедитесь, что в вашей форме есть токен @csrf.

Надеюсь, это решит вашу проблему.

настройка разрешений sudo полностью разбила мой laravel.

Vladimir Despotovic 27.12.2020 20:04

Это то, что у меня сработало. в моем случае я столкнулся с проблемой, когда пытаюсь работать на хосте вместо localhost.

karrar kazuya 12.07.2021 19:36

Хотя в форме есть @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),

Если для этого параметра установлено значение TRUE, браузер потребует от вас использовать протокол HTTPS, в противном случае он не будет сохранять сеанс. Поскольку это не действует

Я попробовал все ответы, представленные здесь. Однако ни один из них не работал у меня на виртуальном хостинге. Однако упомянутый здесь соултион работает для меня Как решить "несоответствие токенов CSRF" в Laravel l

Я просто просмотрел это и завис здесь в поисках ответа ... В моем случае решение было очистить историю браузера.

В моем случае отсутствовал ?> в конце routes / web.php.

то же самое, забыл добавить ?> в конец web.php

msalihbindak 29.10.2020 21:32

ВОТ ЭТО ДА. Не совсем та же проблема в моем случае, но ваше решение заставило меня проверить это, и когда я это сделал, я заметил пробел до в теге открытие<?php, и это то, что вызывало 419 в каждой форме на сайте! Как ни странно, этого не произошло с PHP 7.3, а началось после обновления до 7.4!

Ben Johnson 27.12.2020 04:40

Это сработало и для меня

Tiago Martins Peres 08.04.2021 09:42

Фактически, простое добавление / удаление абзаца из этого файла имеет тот же эффект.

Tiago Martins Peres 08.04.2021 17:35

В моем случае я очищал все входные данные с помощью javascript перед открытием формы, встроенной в модальное представление. По глупости, я не заметил, как он стирает значения входов hidden, в том числе токен csrf. Несмотря на исключение в моем условном для входов с name='_token'. Конечно, мой код был splitting - имена входов с подчеркиванием в массивы. Пришлось сделать исключение для входов hidden.

Если вы добавили @csrf, то также возникает ошибка, убедитесь, что вы не заблокировали файлы cookie ...

Нажмите на Cookies и разрешите ссылку!

В 2021 году я столкнулся с этой ошибкой при применении всех вышеперечисленных решений, каждый мой маршрут выдавал 419. Мое приложение работало нормально на локальном хосте, но 419 на сервере. Затем я получил решение при исправлении файла .env на производстве, remove sanctum variables из .env и установил 'secure' => env('SESSION_SECURE_COOKIE', null) в config / session.php

Это проблема, с которой я сталкивался несколько раз, и обычно возникает при использовании apache.

Если перед открытием <?php в любом из исполняемых файлов есть какие-либо случайные символы или новые строки, то эти символы передаются веб-сервером до того, как файлы cookie будут подготовлены и отправлены.

Это блокирует отправку файлов cookie клиенту, и клиент должен начинать новый сеанс при каждом запросе.

К сожалению, единственное решение - просмотреть каждый созданный или измененный файл (неплохо, если вы используете Git) и убедиться, что <?php являются первыми символами в каждом файле php.

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

Наиболее вероятными кандидатами являются контроллеры, поставщики услуг и файлы маршрутов.

Другие вопросы по теме