Опубликовать запрос в Laravel 5.7, laravel 5.8 --- Ошибка - 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 К сожалению, ваша сессия истекло. Обновите и повторите попытку.
В версии 5.6
такой проблемы не было.
Ответы
Ответ 1
Перед прочтением ниже убедитесь, что в вашей форме есть @csrf
или {{ csrf_field() }}
например
<form method="post">
@csrf <!-- {{ csrf_field() }} -->
... rest of form ...
</form>
Появляется сообщение об ошибке истекшего сеанса, потому что где-то не удается проверить токен csrf, что означает, что App\Http\Middleware\VerifyCsrfToken::class
уже включено. В форме уже добавлена директива @csrf
blade, что также должно быть хорошо.
Тогда другой областью для проверки является сеанс. csrf
токена csrf
напрямую связана с вашим сеансом, поэтому вы можете проверить, работает ли ваш драйвер сеанса, например, неправильно настроенный Redis может вызвать проблему.
Может быть, вы можете попробовать переключить драйвер/программное обеспечение .env
файла .env
, поддерживаемые драйверы приведены ниже
Поддерживаемые драйверы сессий в Laravel 5.7 (Doc Link)
-
file
- сессии хранятся в хранилище /framework/session. -
cookie
- сессии хранятся в безопасных, зашифрованных куки. -
database
- сеансы хранятся в реляционной базе данных. -
memcached
/redis
- сессии хранятся в одном из этих быстрых хранилищ на основе кэша. -
array
- сессии хранятся в массиве PHP и не будут сохраняться.
Если ваша форма работает после переключения драйвера сеанса, то что-то не так с этим конкретным драйвером, попробуйте исправить ошибку оттуда.
Возможные сценарии ошибок
-
Возможно, файловые сеансы могут не работать из-за проблем с правами доступа к каталогу /storage
(быстрое прибегание к поиску поможет вам найти решение)
-
В случае с драйвером базы данных ваше соединение с БД может быть неправильным или таблица sessions
может не существовать или неправильно настроена (неправильная часть конфигурации была подтверждена как проблема согласно комментарию @Junaid Qadir).
-
redis/memcached
неверна или одновременно обрабатывается другим фрагментом кода в системе.
Было бы неплохо выполнить php artisan key:generate
и сгенерировать новый ключ приложения, который, в свою очередь, очистит данные сеанса.
Очистить кэш браузера ТРУДНО, я обнаружил, хром и Firefox быть виновником больше, чем я могу вспомнить.
Узнайте больше о том, почему ключи приложения важны
Ответ 2
Это потому, что форма требует CSRF. В версии 5.7 они изменили его на @csrf
<form action="" method="post">
@csrf
...
Референ: https://laravel.com/docs/5.7/csrf
Ответ 3
вариант 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
Ответ 4
Я использую Laravel 5.7 У меня была та же проблема, и это потому, что токен csrf не был в форме, поэтому добавление
@csrf
исправил проблему
Ответ 5
Как насчет использования
{{ csrf_field() }}
вместо @csrf
Ошибка 419 в основном из-за проблем с токенами csrf.
Ответ 6
Попробуйте закомментировать \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 на сервер.
Ответ 7
измените ваш @csrf
в @csrf
на <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>
Ответ 8
В вашем Http/Kernel.php
попробуйте прокомментировать эту строку:
\Illuminate\Session\Middleware\AuthenticateSession::class,
в вашем сетевом средстве
это может быть корень вашей проблемы
Ответ 9
добавьте токен csrf, и ваша проблема будет решена.
{{}} Csrf_token
или же
@csrf
Ответ 10
В коде нет проблемы. Я проверил с тем же кодом, который вы написали с новой установкой.
Код формы:
<form method="POST" action="/foo" >
@csrf
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
</form>
web.php
файла web.php
:
Route::get('/', function () {
return view('welcome');
});
Route::post('/foo', function () {
echo 1;
return;
});
Результат после отправки формы:
Если вы очистите кеш браузера или попробуйте с другим браузером, я думаю, он будет исправлен.
Ответ 11
По умолчанию у меня не было этой проблемы. Так что я сделал chmod -R 644 sessions
для репликации проблемы.
Впоследствии я дал разрешения на chmod -R 755 sessions
папки chmod -R 755 sessions
теперь мой код проекта работает снова.
Причина в том, что вы храните свой кеш в файле с отсутствием разрешений на запись.
Файл конфигурации сеанса хранится в config/session.php. Обязательно просмотрите параметры, доступные вам в этом файле. По умолчанию Laravel настроен на использование драйвера сеанса файлов, который будет хорошо работать для многих приложений. В производственных приложениях вы можете использовать драйверы memcached или redis для еще более быстрой работы сессии.
Решения:
1 - Как я уже установил выше, вы можете дать 755 разрешений на папку сеансов. 2 - Вы можете использовать другую конфигурацию драйвера сеанса.
файлы - сеансы хранятся в хранилище/каркасе/сеансах. cookie - сеансы хранятся в защищенных, зашифрованных файлах cookie. базы данных - сеансы хранятся в реляционной базе данных. memcached/redis - сеансы хранятся в одном из этих быстрых хранилищ на основе кеша. array - сеансы хранятся в массиве PHP и не сохраняются.
Имей в виду; Если вы хотите использовать memcached/redis, вам необходимо, чтобы они были установлены на вашем сервере, или должен быть запущен ваш контейнер docker redis.
Ответ 12
После такого большого количества времени я получил это решено таким образом
Мой путь установки laravel не совпадает с указанным в файле конфигурации session.php
'domain' => env('SESSION_DOMAIN', 'example.com'),
Ответ 13
419 | Эта ошибка означает, что проблема безопасности laravel означает, что поле токена csrf используется неправильно.
использовать {{csrf_field}}
и ваша проблема будет решена.
Ответ 14
У меня была точно такая же проблема, и мне было совсем глупо. Я отключил все поля формы (а не только кнопку отправки) с помощью javascript перед отправкой указанной формы! Это, конечно, привело к тому, что все элементы формы не были отправлены (включая скрытое поле _token
), что, в свою очередь, вызвало ошибку 419!
Надеюсь, это поможет кому-то с нескольких часов головы царапать!
Отключенные входные данные формы не отображаются в запросе
Ответ 15
Это может быть излишним, но вы можете попробовать следующее:
//Форма добавлена с именем named route со скрытым полем токена.
<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
). Что заставляет меня думать, что line 335
из /vendor/laravel/framework/src/illuminate/Foundation/helpers.php
должна отображать одну и ту же строку, напечатанную вручную выше.
Ответ 16
Вы не можете сделать пустой возврат на Laravel 5.6 или больше. Laravel всегда ожидает, что значение будет возвращено. (Я знаю из прошлого опыта). Это в основном связано с тем, как PHP 7 обрабатывает пустые возвращения.
Ответ 17
Быстрый плохой подход заключается в том, что перейдите в приложение \http\middleware\verifycsrftoken.php и добавьте маршрут в $ except list. Пост-запрос будет игнорироваться для проверки токена CSRF.
protected $except = [
//
'doLogin.aspx',
'create_coupon',
];
Ответ 18
На самом деле SCRF является токеном на основе сеанса. Добавьте свой маршрут в группу маршрутов и добавьте промежуточное программное обеспечение, которое контролирует сеансы.
web является промежуточным программным обеспечением по умолчанию в laravel и может контролировать запросы сеанса.
Route::group(array('middleware' => ['web']), function () {
Route::post('/foo', function () {
echo 1;
return;
});
});
Ответ 19
Просто, чтобы выразить это, у меня были те же проблемы. На моей местной усадьбе он работал бы так, как ожидалось, но после нажатия на сервер разработки я получил сообщение о тайм-ауте сеанса. Выяснив проблему с окружающей средой, я изменил ее с apache на nginx, и это чудесным образом устранило проблему.
Ответ 20
Я получил эту проблему давным-давно. Я вспомнил, что это вызывает разрешение storage/framework/sessions
. Вы можете изменить его с помощью команды chmod -R 0777 storage/framework/sessions
. Это сработало для меня.
Ответ 21
Исключение URI из защиты CSRF
Иногда вы можете захотеть исключить набор URI из защиты CSRF. Например, если вы используете Stripe для обработки платежей и используете их систему webhook, вам нужно будет исключить маршрут обработчика веб-крюков Stripe из защиты CSRF, поскольку Stripe не будет знать, какой токен CSRF отправлять на ваши маршруты.
Обычно такие типы маршрутов следует размещать за пределами группы веб-промежуточного программного обеспечения, которую RouteServiceProvider применяет ко всем маршрутам в файле route/web.php. Однако вы также можете исключить маршруты, добавив их URI к свойству $ кроме промежуточного программного обеспечения VerifyCsrfToken:
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'stripe/*',
'http://example.com/foo/bar',
'http://example.com/foo/*',
];
}
Ответ 22
В моем случае это очень смешно. Я получаю ошибку 419, когда я помещаю Auth::routes()
в верхней части файла маршрута.
Auth::routes();
Route::middleware('auth')->group(function () {
Route::get('/', '[email protected]')->name('dashboard');
});
И я исправил ошибку, переместив Auth::routes();
в конец файла маршрута.
Route::middleware('auth')->group(function () {
Route::get('/', '[email protected]')->name('dashboard');
});
Auth::routes();
Может быть, это может помочь и вашему делу. Удачи.
Ответ 23
Это странно.
У меня есть два проекта Laravel , и оба из версии Laravel все 5.8.16.
один проект laravel должен использовать @csrf ,, а другой проект должен использовать {{csrf_field()}}
это неразумно ~~
Ответ 24
Обратите внимание, что вы получаете сообщение об ошибке 419, если вы пытаетесь загрузить большой файл, размер файла которого превышает ограничение.
В этом случае вы можете увеличить и upload_max_filesize, и post_max_size до разумной суммы (например, 10 или 20 миллионов в зависимости от вашего варианта использования и ресурсов), проверьте здесь:
fooobar.com/questions/18592/...
Но это может вызвать проблемы с потреблением ресурсов, например, пропускную способность и объем памяти. В качестве решения вы можете проверить размер файла перед отправкой формы и показать предупреждение.
Ответ 25
Это может быть проблема с вашей сессией. После игры с этими настройками я решил свою проблему. Для меня это оказался последний вариант.
- Если вы используете "файл" в качестве драйвера сеанса, посмотрите на
хранилище/рамки/сеансы, если сеансы сохраняются после
обновить. Если нет, скорее всего из-за неправильной папки
разрешения. Убедитесь, что ваше хранилище/папка имеют правильные права
- Попробуйте отключить все 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.
Ответ 26
У меня также была такая проблема, и я обнаружил, что файлы сеанса были заблокированы для записи. Итак, я не знаю, используете ли вы свой Laravel с помощью таких вещей, как бродяга или докер, но я советую вам попробовать изменить права на каталог сеанса (и файлы, конечно) (когда вы запустите Laravel на виртуальной машине, вы должны изменять права локально и на виртуальной машине (например, при совместном использовании файлов через NFS)
Как это:
chmod -R 777 storage/framework/sessions
chmod -R 777 storage/logs
Я знаю, разрешение 777 - самое страшное бедствие, которое вы когда-либо могли себе представить. Но они удобны для устранения неполадок.
Чтобы быть уверенным, что я никогда не забывал об этом, я создал сценарий bash. (Вызывается lalog, только потому, что я хотел очистить файлы журнала и установить разрешения)
Примечание. Убедитесь, что вы используете это в каталоге сеанса. В files
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)
Кроме того, я знаю, что это уже упоминалось. Но, будьте полностью уверены, что вы всегда
- Разрешить использование файлов cookie в браузере, поэтому маркер может быть установлен в файлах cookie
- Проверьте, используете ли вы
@csrf
в файле @csrf
Форма должна быть чем-то вроде этого
<form method="POST" action="{{ route('login') }}">
@csrf
.......
</form>
Ответ 27
Вы неправильно добавили поле CSRF. Вместо @csrf
вы должны использовать csrf_field()
следующим образом:
<form method="POST" action="/foo" >
{{ csrf_field() }}
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
</form>
Ответ 28
У меня была аналогичная проблема, и я нашел решение для этого
если вы эхо или распечатаете что-то из контроллера, а возврат - для просмотра этой проблемы.
поэтому убедитесь, что вы не используете эхо или печать, когда ваш контроллер возвращается
Ответ 29
Просто измените .env SESSION_DRIVER = cookie
Ответ 30
использовать
{{@csrf_field()}}
insted из
@csrf