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


88

Я установил 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();. Насколько я могу судить, приложению нечего делать после почтового запроса. Возможно, вы сможете перенаправить его в представление после обработки запроса.
dcangulo 01

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

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

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

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

Ответы:


113

Перед чтением ниже убедитесь, что у вас есть @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 виноваты больше, чем я могу вспомнить.

Подробнее о том, почему важны ключи приложения


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

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

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

38

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

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

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


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

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

13

случай 1: если вы запускаете проект в своей локальной системе, например 127.0.01: 8000,

тогда

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

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

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

случай 2: если проект запущен на сервере и у вас есть домен вроде "mydomain.com"

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

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

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



9

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

@csrf

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


7

Попробуйте прокомментировать, \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 на сервер.


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

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

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

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

6

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

6

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

  • Если вы используете «файл» в качестве драйвера сеанса, просмотрите хранилище / фреймворк / сеансы, если сеансы сохраняются после обновления. Если нет. Скорее всего, это связано с неправильными правами доступа к папке. Убедитесь, что ваше хранилище / папка правильно
  • Попробуйте отключить весь Javascript на своих страницах (отключив его через навигатор или внутри кода) и убедитесь, что 'http_only' => true,
  • Попробуйте использовать с 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 Session всегда изменяет каждое обновление / запрос в Laravel 5.4.


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

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

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


4

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

@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.

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


3

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

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

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

2

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

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

<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). Что заставляет меня думать, что is line 335of /vendor/laravel/framework/src/illuminate/Foundation/helpers.phpдолжен отображать ту же строку, введенную вручную выше.


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

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

2

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

Код формы:

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

Результат после отправки формы: Вывод после отправки формы

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


2

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

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

2

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

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


2

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

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

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

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

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

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


1

В твоем Http/Kernel.php

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

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

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

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


1

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

введите описание изображения здесь

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

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

введите описание изображения здесь

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

Файл конфигурации сеанса хранится в config / session.php. Обязательно просмотрите варианты, доступные вам в этом файле. По умолчанию Laravel настроен на использование драйвера файлового сеанса, который хорошо работает для многих приложений. В производственных приложениях вы можете рассмотреть возможность использования драйверов memcached или redis для еще большей производительности сеанса.

Решения:

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

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

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


1

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

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

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

1

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

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

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


1

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

1. команда

php artisan config:cache

2. команда

php artisan route:clear


1

Хотя форма есть @csrf, она все еще показывает419 pages has expired

Я решил это после SESSION_SECURE_COOKIEпараметра обновления false в config / session.php

'secure' => env('SESSION_SECURE_COOKIE', false)

чем очистить кеш


1

Перейдите в config / sessions.php

найди строку

'secure' => env('SESSION_SECURE_COOKIE', true),

измените его на false

'secure' => env('SESSION_SECURE_COOKIE', false),

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


1

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



0

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

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

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


0

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


0

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

Может быть, это поможет и твоему делу. Удачи.


0

Обратите внимание, что вы получаете ошибку 419, если пытаетесь загрузить большой файл, размер которого превышает ограничение на размер почтового файла. В этом случае вы можете увеличить как upload_max_filesize, так и post_max_size до разумной суммы (например, 10M или 20M в зависимости от вашего варианта использования и ресурсов), проверьте здесь: https://stackoverflow.com/a/2184541/2100489

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.