Я новичок в Laravel и у меня есть проблема, которую я не понимаю. У меня есть форма журнала в моем проекте, и мой метод POST. Когда я пытаюсь запрос, результат:
"Срок действия страницы истек из-за неактивности. Пожалуйста, обновите и попробуйте снова.
Но если я изменю метод на GET, он будет работать нормально.
Может кто-нибудь сказать мне, почему это и как это исправить? потому что, конечно, мне нужен метод POST.
Эта проблема возникает из-за сбоя проверки токена CSRF. Так что либо вы не публикуете один, либо вы публикуете неправильный.
Причина, по которой он работает для GET, заключается в том, что для маршрута GET в Laravel нет размещенного токена CSRF.
Вы можете опубликовать токен CSRF в своей форме, позвонив:
{{ csrf_field() }}
Или исключите ваш маршрут (НЕ РЕКОМЕНДУЕТСЯ ИЗ-ЗА БЕЗОПАСНОСТИ) в app/Http/Middleware/VerifyCsrfToken.php
:
protected $except = [
'your/route'
];
VerifyCsrfToken.php
маршрут будет уязвимым для CSRF-атаки, я думаю
В моем случае я получил то же сообщение об ошибке, а затем выяснил, что пропустил добавление csrf_token
для поля формы. Затем добавьте csrf_token
.
Использование помощника по формам,
{{ csrf_field() }}
Или без помощника формы, который будет,
<input type="hidden" name="_token" value="{{ csrf_token() }}">
Если это не сработает, then-
Обновить кеш браузера
и теперь это может сработать, спасибо.
Обновление для Laravel 5.6
Laravel интегрирует новый @csrf
вместо {{ csrf_field() }}
. Теперь это выглядит лучше.
<form action="">
@csrf
...
</form>
Каждый раз, когда вы определяете HTML-форму в своем приложении, вы должны включить в форму скрытое поле токена CSRF, чтобы связующее ПО защиты CSRF могло проверить запрос. Вы можете использовать помощник csrf_field
для генерации поля токена:
<form method="POST" action="/profile">
{{ csrf_field() }}
...
</form>
Это не работает, затем обновите кеш браузера и теперь он может работать,
Для более подробной информации откройте ссылку: - CSRF Protection в Laravel 5.5
ОБНОВИТЬ:
С Laravel 5.6 с использованием шаблонов Blades это довольно просто.
<form method="POST" action="/profile">
@csrf
...
</form>
Для более подробной информации откройте ссылку: - Защита CSRF в Laravel 5.6
Убедитесь, что ваш файл config/session.php содержит эту строку
'domain' => env('SESSION_DOMAIN', null),
Затем удалите строку SESSION_DOMAIN
в вашем файле.env
Это происходит потому, что вы используете промежуточное ПО CSRV по умолчанию из установки Laravel. Чтобы решить эту проблему, удалите эту строку из Kernel.php:
\App\Http\Middleware\VerifyCsrfToken::class,
Это нормально, если вы создаете API. Однако, если вы создаете веб-сайт, это проверка безопасности, поэтому имейте в виду его риски.
Пробовал разные решения, чтобы решить проблему в течение нескольких недель безуспешно.
Проблема, с которой я столкнулся, была вызвана обновлением с laravel 5.0 до 5.5 и забыл обновить config/session.php
Если кто-то сталкивается с проблемой, попробуйте обновить config/session.php, чтобы он соответствовал версии на Laravel, которую вы используете.
Поместите {{csrf_field()}}
тег form
У меня была такая же проблема. используйте "четкие данные просмотра" в хроме. может решить вашу проблему.
Во-первых, включите csrf в вашу форму.
{{ csrf_field() }}
если проблема не решилась, используйте ob_start();
в самом начале index.php.
<?php ob_start();
Если вы уже включили токен CSRF в свою форму. Затем вы получаете страницу с ошибкой, возможно, из-за данных кэша в вашей форме.
Откройте свой терминал/командную строку и выполните эти команды в корне вашего проекта.
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
,Также попробуйте очистить кеш браузера вместе с этими командами.
если ваша конфигурация установлена: SESSION_DRIVER = файл, вы должны проверить, доступен ли для записи каталог вашей сессии. Проверьте хранилище/рамки/сеанс
В моем случае я добавил ob_start(); в верхней части моего index.php на сервере, и все, кажется, работает нормально.
Я столкнулся с той же ошибкой, поэтому я просто удалил эту строку из моего.env файла
SESSION_DRIVER = yourwebsite.com
Просто разместите этот код внутри формы
<input type = "hidden" name = "_token" value = "<?php echo csrf_token() ?>" />
У меня была такая же проблема, я пробовал много решений. но никто не работал для меня. затем я узнал, что по какой-то причине я использовал это в своем файле .env:
SESSION_DOMAIN = myapp.me
и как только я вернул его к нулю, все заработало просто отлично.
если вам нужно изменить действие формы с Javascript, у вас будет та же проблема
1. сначала вам нужно использовать вместо {!!Form::open() !!} {!! close() !!}
{!!Form::open() !!} {!! close() !!}
в laravel
2. во-вторых, вы чаще всего начинаете свое действие с https://www.example.com +your Route
Не забудьте WWW в вашем URL!
Это может быть токен csrf, которого нет в вашей форме. Вы должны использовать @crsf
или {{ csrf_field() }}
Если вы используете csrf в вашей форме. Это может быть кеш. Очистите кеш вашего приложения.
php artisan cache:clear
php artisan view:clear
php artisan cache:clear
И очистите кеш вашего браузера.
Если ошибки снова показывают вам, то создайте новый ключ
php artisan key:generate
Просто добавьте @csrf
внутри тега формы.
Или вы можете включить csrf_token
в заголовок, чтобы отправлять его при каждом запросе.
моя проблема решена простым добавлением @csrf
в тег формы
Laravel 5.6
не поддерживает {{ csrf_field() }}
просто добавьте @csrf
вместо {{ csrf_field() }}
larvel_fix_error.png
Я знаю, что на этот вопрос был получен удовлетворительный ответ, но я хотел бы упомянуть исправление, которое сработало в моем случае. Я добавил {{ csrf_field() }}
и он все еще не работал.
Потом я вспомнил, что заблокировал все куки файлы для целей разработки, что может быть хорошо, когда вы меняете страницу и хотите обновить ее.
Как только я изменил настройки, чтобы прекратить блокировку всех файлов cookie в MS Edge browser
проблема исчезла.
Мы получили его, скопировав маршруты из Router.php вместо использования Auth:: routes(), это маршруты, которые вам нужны:
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
// Registration Routes...
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('register', 'Auth\RegisterController@register');
// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');
Это смешно, но это работает для меня. Я понял, что это вызвано из-за HTML TAG по умолчанию в коде laravel. Вместо этого используйте /* */или {{-}}
Или попробуйте удалить недавно HTML-код Coment в вашем коде... Или измените комментарий HTML для комментария Php... Или попробуйте запустить команду Any Worng artisan, например, очистить браузер php artisan и посмотреть, выводит ли он какие-либо HTML-данные вместе с ошибкой...
В моем случае та же проблема была вызвана тем, что я забыл добавить >
в конце моего скрытого поля ввода, например: <input type="hidden" name="_token" value="{{ Session::token() }}"
Итак, я исправил его, добавив его:
<input type="hidden" name="_token" value="{{ Session::token() }}">
Тем не менее, у кого-то есть эта проблема, используйте следующий код внутри формы, как показано ниже.
echo '<input type = "hidden" name = "_token" value = "'. csrf_token().'" >';
Перейдите в App/Kernel.php
и прокомментируйте \App\Http\Middleware\VerifyCsrfToken::class
.