J'ai installé Laravel 5.7
Ajout d'un formulaire au fichier \resources\views\welcome.blade.php
<form method="POST" action="/foo" >
@csrf
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
</form>
Ajouté au fichier \routes\web.php
Route::post('/foo', function () {
echo 1;
return;
});
Après l'envoi d'une requête POST:
419 Désolé, votre session a expiré. Veuillez actualiser et réessayer.
Dans la version, 5.6
il n'y avait pas un tel problème.
return;
vous pouvez appelerreturn redirect()->back();
. D'après ce que je peux voir, l'application n'a rien à faire après la demande de publication. Vous pouvez peut-être le rediriger vers une vue après avoir traité la demande.file
forSESSION_DRIVER
in,.env
cela fonctionne bien. Pourquoi la session basée sur la base de données ne fonctionne-t-elle pas?vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php
ligne de fichier 67 pour savoir pourquoisessions
table dans un but différent. Après avoir changé ce nom de table en un nom plus adapté et exécutéartisan session:table
et actualisé la migration, tout fonctionneRéponses:
Avant de lire ci-dessous, assurez-vous que vous avez
@csrf
ou{{ csrf_field() }}
dans votre formulaire comme<form method="post"> @csrf <!-- {{ csrf_field() }} --> ... rest of form ... </form>
Le message d'erreur Session expirée ou 419 pages expirées dans larvel s'affiche parce que quelque part votre vérification de jeton csrf échoue, ce qui signifie que le
App\Http\Middleware\VerifyCsrfToken::class
middleware est déjà activé. Dans le formulaire, la@csrf
directive sur les lames est déjà ajoutée, ce qui devrait également convenir.Ensuite, l'autre domaine à vérifier est la session. La
csrf
vérification du jeton est directement impliquée dans votre session.Vous voudrez peut-être vérifier si votre pilote de session fonctionne ou non, par exemple un Redis mal configuré peut causer un problème.Peut-être que vous pouvez essayer de changer votre pilote / logiciel de session à partir de votre
.env
fichier, les pilotes pris en charge sont indiqués ci-dessousPilotes de session pris en charge dans Laravel 5, Laravel 6 et Laravel 7 (Doc Link)
file
- les sessions sont stockées dans stockage / framework / sessions.cookie
- les sessions sont stockées dans des cookies sécurisés et cryptés.database
- les sessions sont stockées dans une base de données relationnelle.memcached
/redis
- les sessions sont stockées dans l'un de ces magasins rapides basés sur le cache.array
- les sessions sont stockées dans un tableau PHP et ne seront pas persistantes.Si votre formulaire fonctionne après le changement de pilote de session, alors quelque chose ne va pas avec ce pilote particulier, essayez de corriger l'erreur à partir de là.
Scénarios possibles sujets aux erreurs
Il est probable que les sessions basées sur des fichiers ne fonctionnent pas à cause des problèmes d'autorisation avec le
/storage
répertoire (une recherche rapide sur Google vous cherchera la solution), rappelez-vous également que mettre 777 pour le répertoire n'est jamais la solution.Dans le cas du pilote de base de données, votre connexion à la base de données peut être erronée, ou la
sessions
table peut ne pas exister ou mal configurée (la mauvaise partie de configuration a été confirmée comme étant un problème selon le commentaire de @Junaid Qadir).redis/memcached
La configuration est erronée ou est manipulée par un autre morceau de code dans le système en même temps.Il peut être judicieux d'exécuter
php artisan key:generate
et de générer une nouvelle clé d'application qui, à son tour, videra les données de session.Effacer le cache du navigateur HARD , j'ai trouvé que Chrome et Firefox étaient plus coupables que je ne m'en souvienne.
En savoir plus sur l'importance des clés d'application
la source
_token
valeur reçue du FORM. Évitez d'utiliserSESSION_DOMAIN=...
avec une adresse IP que les spécifications des cookies Chrome et HTTP considèrent comme non sécurisée.419 Page Expired
apparaît. Par souci de convivialité, comment dire à un simple utilisateur ce qui vient de se passer et comment le résoudre?Ceci est dû au fait que le formulaire nécessite un csrf. Dans la version 5.7, ils l'ont changé en @csrf
<form action="" method="post"> @csrf ...
Referene: https://laravel.com/docs/5.7/csrf
la source
csrf
champ, je viens de regarder l'historique d'éditionpuis
ajoutez
SESSION_DOMAIN=
votre fichier .envou dans votre config / session.php
'domain' => env('SESSION_DOMAIN', ''),
puis exécutez
php artisan cache:clear
ajoutez
SESSION_DOMAIN=mydomain.com
votre fichier .envou dans votre config / session.php
'domain' => env('SESSION_DOMAIN', 'mydomain.com'),
puis exécutez
php artisan cache:clear
la source
Que diriez-vous d'utiliser
{{ csrf_field() }}
au lieu de@csrf
L'erreur 419 est principalement due à des problèmes de jeton csrf.
la source
{{ csrf_field() }}
?J'utilise Laravel 5.7 J'ai eu le même problème et c'était parce que le jeton csrf n'était pas dans le formulaire, donc en ajoutant
résolu le problème
la source
Essayez de commenter
\App\Http\Middleware\EncryptCookies::class
dans\app\Http\Kernel.php
J'ai un problème similaire et résolvez-le en le faisant. Probablement pas la meilleure solution car la sécurité, mais au moins cela fonctionnait.Auparavant, j'ai essayé:
\App\Http\Middleware\VerifyCsrfToken::class
dans\app\Http\Kernel.php
\Illuminate\Session\Middleware\AuthenticateSession::class
dans\app\Http\Kernel.php
Mais aucun de ces éléments ci-dessus n'a fonctionné pour moi.
ÉDITER
Mon cas ici est que chaque fois que je me connecte, un nouveau fichier de session sera créé (l'ancien est toujours persistant, mais soudainement oublié. Vérifiez
storage/framework/sessions
) et un nouveau jeton CSRF est généré. Le problème ne vient donc pas de VerifyCsrfToken.Comme @Vladd l'a mentionné dans la section des commentaires, vous ne devriez jamais commenter
\App\Http\Middleware\VerifyCsrfToken::class
. Vous devez vérifier que vous avez envoyé le bon TOKEN CSRF au serveur.la source
changez votre
@csrf
dans welcome.blade.php en<input type="hidden" name="_token" value="{{ csrf_token() }}">
donc votre code comme ceci:
<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>
la source
Cela pourrait être un problème avec votre session. Après avoir joué avec ces paramètres, j'ai résolu mon problème. Pour moi, cela s'est avéré être la dernière option.
Source: Laravel Session change toujours chaque actualisation / demande dans Laravel 5.4
la source
SESSION_SECURE_COOKIE
commutateur (changé enfalse
) l'a fait pour moi. (onlocalhost:8000
)ajoutez un jeton csrf et votre problème sera résolu. {{csrf_token}} ou @csrf
la source
Pour résoudre cette erreur, vous devez d'abord insérer l'une des commandes suivantes dans la balise form.
@csrf
OU{{ csrf_field }}
Si votre problème n'est pas résolu, procédez comme suit: (Notez que l'une des commandes ci-dessus doit être dans la balise form)
1.Insérez l'une des commandes suivantes dans la balise de formulaire
@csrf
OU{{ csrf_field }}
2.Ouvrez le fichier .env et remplacez les valeurs par le "fichier" dans la section SESSION_DRIVER.
3.Ensuite, vous devez réinitialiser le cache laravel. tapez ci-dessous les commandes dans le terminal
php artisan view:clear
php artisan route:clear
php artisan cache:clear
php artisan config:cache
Dans la dernière étape, débranchez le projet du service et cliquez à nouveau sur php artisan serve
J'espère que votre problème est résolu
la source
Après tant de temps, je l'ai résolu de cette façon
Mon chemin d'installation de laravel n'était pas le même que celui défini dans le fichier de configuration session.php
'domain' => env('SESSION_DOMAIN', 'example.com'),
la source
C'est peut-être exagéré, mais vous pouvez essayer ceci:
// Formulaire appelant la route nommée avec un champ de jeton caché ajouté.
<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 nommée
Route::post('/foo', function () { return 'bar'; })->name('foo');
// Ajoutez ceci dans le
<head></head>
bloc:<meta name="_token" content="{!! csrf_token() !!}" />
Je l'ai testé sur mon local en utilisant Homestead sur Laravel 5.7 qui était une nouvelle installation à l'aide de Laravel Installer 2.0.1 et cela a fonctionné. Quel est votre environnement?
Théorie: Je me demande si cela a quelque chose à voir avec la lame de rendu des balises html avec par
{{ }}
rapport à{!! !!}
votre environnement ou la façon dont vous le servir (par exemple.php artisan serve
). Ce qui me fait penser que c'estline 335
de/vendor/laravel/framework/src/illuminate/Foundation/helpers.php
devrait rendre la même ligne tapée manuellement ci-dessus.la source
<meta>
balises doivent être placées dans le<head>
, pas à l'intérieur du<body>
. Je ne suis pas sûr que le validateur HTML aimerait cela.Il n'y a aucun problème dans le code. J'ai vérifié avec le même code que vous avez écrit avec la nouvelle installation.
Code de formulaire:
<form method="POST" action="/foo" > @csrf <input type="text" name="name"/><br/> <input type="submit" value="Add"/> </form>
web.php
code de fichier:Route::get('/', function () { return view('welcome'); }); Route::post('/foo', function () { echo 1; return; });
Le résultat après avoir soumis le formulaire est:
Si vous effacez le cache de votre navigateur ou essayez avec un autre navigateur, je pense que cela sera corrigé.
la source
Une mauvaise approche rapide est d'aller dans app \ http \ middleware \ verifycsrftoken.php et d'ajouter la route dans $ except list. La demande de publication sera ignorée pour la vérification du jeton CSRF.
protected $except = [ // 'doLogin.aspx', 'create_coupon', ];
la source
419 | page cette erreur signifie un problème de sécurité laravel, cela signifie que le champ du jeton csrf n'est pas utilisé correctement.
utilisez
{{csrf_field}}
et votre problème sera résolu.la source
Cela devrait fonctionner si vous essayez toutes ces étapes:
Assurez-vous que votre session est bien configurée, le moyen le plus simple est de créer un fichier et de vous assurer que le dossier de stockage a l'autorisation chmod 755, puis dans votre
.env
configuration, le pilote de session de fichier est le moyen le plus simple de définir.SESSION_DRIVER=file SESSION_DOMAIN= SESSION_SECURE_COOKIE=false
Assurez-vous que le dossier Cache est effacé et accessible en écriture, vous pouvez le faire en exécutant la commande artisanale ci-dessous.
Assurez-vous que les autorisations de dossier sont bien définies, elles doivent être configurées comme ci-dessous:
sudo chmod -R 755 storage sudo chmod -R 755 vendor sudo chmod -R 644 bootstrap/cache
Assurez-vous que votre formulaire a
@csrf
jeton.J'espère que cela résoudra votre problème.
la source
Dans votre
Http/Kernel.php
essayez de commenter cette ligne:
\Illuminate\Session\Middleware\AuthenticateSession::class,
dans votre tableau middleware Web
cela pourrait être la racine de votre problème
la source
Par défaut, je n'ai pas eu ce problème. Donc ce que j'ai fait, c'est
chmod -R 644 sessions
reproduire le problème.Ensuite, j'ai donné des autorisations au dossier de sessions par
chmod -R 755 sessions
maintenant mon code de projet fonctionne à nouveau.
La raison pour laquelle cela se produit est que vous stockez votre cache dans un fichier sans autorisation d'écriture.
Solutions:
1 - Comme je l'ai fixé ci-dessus, vous pouvez donner 755 l'autorisation au dossier sessions. 2 - Vous pouvez utiliser une autre configuration de pilote de session.
Garder à l'esprit; Si vous souhaitez utiliser memcached / redis, vous devez les installer sur votre serveur ou votre conteneur docker redis doit être en cours d'exécution.
la source
En fait, CSRF est un jeton basé sur une session. Ajoutez votre route dans un groupe de routes et ajoutez un middleware qui contrôle les sessions.
web est un middleware par défaut dans laravel et il peut contrôler les demandes de session.
Route::group(array('middleware' => ['web']), function () { Route::post('/foo', function () { echo 1; return; }); });
la source
Si vous avez déjà le csrf directive , vous avez peut-être changé la façon dont les sessions s'exécutent.
Dans
config/session.php
, cochez la case «sécurisé» champ . Il doit être sur false si https n'est pas disponible sur votre serveur.Vous pouvez également mettre
SESSION_SECURE_COOKIE=FALSE
votre.env
fichier (répertoire racine).la source
ouvrez la ligne de commande cmd sur votre projet.
1. commande
2.com et
la source
Avez-vous également le csrf dans l'en-tête de votre application?
<meta name="csrf-token" content="{{ csrf_token() }}">
la source
Bien que le formulaire ait
@csrf
, il montre toujours419 pages has expired
Je l'ai résolu après l'
SESSION_SECURE_COOKIE
option de mise à jour sur false dans config / session.php'secure' => env('SESSION_SECURE_COOKIE', false)
que vider le cache
la source
Accédez à config / sessions.php
trouver la ligne
'secure' => env('SESSION_SECURE_COOKIE', true),
changez-le en faux
'secure' => env('SESSION_SECURE_COOKIE', false),
Si ce paramètre est défini sur TRUE, le navigateur vous demandera d'utiliser le protocole HTTPS, sinon il ne stockera pas la session. Comme ce n'est pas valide
la source
Je viens de parcourir tout cela et je planais ici pour une réponse .. Dans mon cas, la solution était d'effacer l'historique du navigateur.
la source
Dans mon cas, il y avait un?> À la fin de routes.php. J'y ai passé beaucoup de temps ...
la source
?>
à la fin deweb.php
J'avais exactement le même problème et c'était parce que j'étais complètement stupide. J'avais désactivé tous les champs du formulaire (plutôt que simplement le bouton d'envoi) via javascript avant de soumettre ledit formulaire! Ceci, bien sûr, a eu pour conséquence que tous les éléments du formulaire n'étaient pas soumis (y compris les éléments masqués
_token
champ ), ce qui a entraîné l'erreur 419!J'espère que cela aide quelqu'un de quelques heures à se gratter la tête!
Les entrées de formulaire désactivées n'apparaissent pas dans la demande
la source
J'ai eu ce problème il y a longtemps. Je me suis souvenu qu'il provoque la permission de
storage/framework/sessions
. Vous voudrez peut-être le changer parchmod -R 0777 storage/framework/sessions
commande. Cela a fonctionné pour moi.la source
Dans mon cas, c'est très ridicule. J'obtiens l'erreur 419 lorsque je mets
Auth::routes()
en haut du fichier d'itinéraire.Auth::routes(); Route::middleware('auth')->group(function () { Route::get('/', 'DashboardController@index')->name('dashboard'); });
Et j'ai corrigé l'erreur en passant
Auth::routes();
au bas du fichier d'itinéraire.Route::middleware('auth')->group(function () { Route::get('/', 'DashboardController@index')->name('dashboard'); }); Auth::routes();
Peut-être que cela peut également aider votre cas. Bonne chance.
la source
Veuillez noter que vous obtenez l'erreur 419 si vous essayez de télécharger un gros fichier qui dépasse la limite de taille du fichier de publication. Dans ce cas, vous pouvez augmenter à la fois upload_max_filesize et post_max_size à un montant raisonnable (par exemple, 10M ou 20M dépend de votre cas d'utilisation et de vos ressources), vérifiez ici: https://stackoverflow.com/a/2184541/2100489
Mais cela peut entraîner des problèmes de consommation de ressources, par exemple la bande passante et le stockage. Comme solution, vous pouvez vérifier la taille du fichier avant de soumettre le formulaire et afficher un message d'avertissement.
la source