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 avoir envoyé une demande 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.
Avant de lire ci-dessous, assurez-vous que vous avez bien @csrf
ou {{ csrf_field() }}
dans votre formulaire
<form method="post">
@csrf <!-- {{ csrf_field() }} -->
... rest of form ...
</form>
Le message d'erreur de session expirée s'affiche car la vérification du jeton csrf échoue quelque part, ce qui signifie que le middleware App\Http\Middleware\VerifyCsrfToken::class
est déjà activé. Sous la forme, la directive de lame @csrf
est déjà ajoutée, ce qui devrait également convenir.
Ensuite, l'autre domaine à vérifier est la session. La vérification du jeton csrf
est directement impliquée dans votre session. Par conséquent, vous pouvez vérifier si votre pilote de session fonctionne ou non. Par exemple, un Redis configuré de manière incorrecte peut provoquer un problème.
Peut-être que vous pouvez essayer de changer votre pilote de session/logiciel de votre fichier .env
, les pilotes supportés sont donnés ci-dessous
Pilotes de session pris en charge dans Laravel 5.7(Doc Link)
file
- les sessions sont stockées dans storage/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 persistées.Si votre formulaire fonctionne après le changement de pilote de session, il y a un problème avec ce pilote, essayez de corriger l'erreur à partir de là.
_/Scénarios susceptibles de provoquer des erreurs
Les sessions basées sur des fichiers risquent de ne pas fonctionner à cause des problèmes d’autorisation avec le répertoire /storage
(un rapide googling va vous chercher la solution)
Dans le cas du pilote de base de données, votre connexion à la base de données peut être incorrecte ou la table sessions
peut ne pas exister ou être configurée de manière incorrecte (la configuration incorrecte a été confirmée comme étant un problème selon le commentaire de @Junaid Qadir).
redis/memcached
est incorrecte ou est manipulée par un autre élément 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 la session.
Effacer le cache du navigateur HARD, j'ai découvert que Chrome et Firefox étaient plus que jamais un coupable.
Cela est dû au fait que le formulaire nécessite un fichier csrf. Dans la version 5.7, ils l'ont changé en @csrf
<form action="" method="post">
@csrf
...
Référence: https://laravel.com/docs/5.7/csrf
Comment utiliser
{{ csrf_field() }}
au lieu de @csrf
L'erreur 419 est principalement due à des problèmes de jeton csrf.
J'utilise Laravel 5.7 J'ai eu le même problème et c'était parce que le jeton CSRF n'était pas sous la forme
@csrf
résolu le problème
cas 1: si vous exécutez un projet dans votre système local tel que 127.0.01: 8000,
puis
ajoutez SESSION_DOMAIN=
dans votre fichier .env
ou dans votre config/session.php 'domain' => env('SESSION_DOMAIN', ''),
puis exécutez php artisan cache:clear
cas 2: si le projet est en cours d'exécution sur le serveur et que vous avez un domaine tel que "mydomain.com"
ajoutez SESSION_DOMAIN=mydomain.com
dans votre fichier .env
ou dans votre config/session.php 'domain' => env('SESSION_DOMAIN', 'mydomain.com'),
puis exécutez php artisan cache:clear
remplacez votre @csrf
dans welcome.blade.php par <input type="hidden" name="_token" value="{{ csrf_token() }}">
alors votre code ressemble à 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>
Vous avez ajouté le champ CSRF de manière incorrecte. Au lieu de @csrf
, vous devriez utiliser csrf_field()
comme ceci:
<form method="POST" action="/foo" >
{{ csrf_field() }}
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
</form>
Essayez de commenter \App\Http\Middleware\EncryptCookies::class
dans \app\Http\Kernel.php
J'ai un problème similaire et je l'ai résolu en procédant de la sorte . Probablement pas la meilleure solution car la sécurité mais au moins cela a fonctionné.
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 ci-dessus n'a fonctionné pour moi.
Je venais juste d'avoir exactement le même problème et il était essentiel que je sois complètement stupide. J'avais désactivé tous les champs du formulaire (plutôt que le bouton de soumission) via javascript avant de soumettre ledit formulaire! Bien entendu, cela a eu pour résultat que tous les éléments du formulaire n'ont pas été soumis (y compris le champ _token
caché), ce qui a généré 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 requête
Il n'y a pas de 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 du fichier:
Route::get('/', function () {
return view('welcome');
});
Route::post('/foo', function () {
echo 1;
return;
});
Le résultat après la soumission du formulaire est:
Si vous effacez le cache de votre navigateur ou essayez avec un autre navigateur, je pense que cela sera corrigé.
Vous ne pouvez pas faire de déclaration vide sur Laravel 5.6 ou plus. Laravel s'attend toujours à ce qu'une valeur soit retournée. (Je sais par expérience) . C'est principalement lié à la façon dont PHP 7 traite les retours vides.
C'est peut-être exagéré, mais vous pouvez essayer ceci:
// Formulaire appelant named route avec un champ de jeton masqué 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>
// Nommé Route
Route::post('/foo', function () {
return 'bar';
})->name('foo');
// Ajouter ceci dans le bloc <head></head>
:
<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 en utilisant Laravel Installer 2.0.1 et tout fonctionnait bien. Quel est votre environnement?
Théorie: je me demande si cela a quelque chose à voir avec le rendu des balises HTML avec {{ }}
contre {!! !!}
sur votre environnement ou la façon dont vous le fournissez (par exemple, php artisan serve
). Ce qui me fait penser que c'est line 335
sur /vendor/laravel/framework/src/illuminate/Foundation/helpers.php
devrait afficher la même ligne saisie manuellement ci-dessus.
J'ai également eu un problème comme celui-ci et j'ai découvert que les fichiers de session étaient verrouillés en écriture. Donc, je ne sais pas si vous utilisez votre Laravel via des éléments tels que vagrant ou Docker, mais je vous conseille d'essayer de modifier les droits du répertoire de la session (et des fichiers bien sûr) (lorsque vous exécutez Laravel dans un VM vous devez modifier les droits localement et dans VM (comme lorsque vous partagez des fichiers via NFS)
Comme ça:
chmod -R 777 storage/framework/sessions
chmod -R 777 storage/logs
Je sais, une autorisation 777 est la pire catastrophe que vous puissiez imaginer. Mais ils sont pratiques pour le dépannage.
Pour être sûr de ne jamais l'oublier, j'ai créé un script bash. (Appelé cela lalog, simplement parce que je voulais effacer les fichiers journaux et définir des autorisations)
Remarque: Assurez-vous de l'utiliser dans le répertoire de la session. Dans config/session.php, il existe une clé files
déclarée avec l'emplacement. Dans mon cas:
<?php
//...........
'files' => storage_path('framework/sessions'),
//...........
Emplacement:/usr/bin/lalog (il s’agit d’un fichier et non d’un répertoire)
Exécuter dans Shell en tant que 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"
Attention! Cela permettra un accès en écriture pour tout le monde, alors soyez prudent avec ce dernier! De plus, le fichier journal de Laravel contient peut-être des informations utiles. (assurez-vous de regarder dans ce fichier journal avant d'exécuter mon script bash)
Aussi, je sais que c'est déjà mentionné. Mais, soyez totalement sûr que vous avez toujours
@csrf
dans votre fichier de lameLe formulaire devrait être quelque chose comme ça
<form method="POST" action="{{ route('login') }}">
@csrf
.......
</form>
Dans votre Http/Kernel.php
essayez de commenter cette ligne:
\Illuminate\Session\Middleware\AuthenticateSession::class,
dans votre tableau de middleware Web
ce pourrait être la racine de votre problème
Juste pour le dire, j’ai eu les mêmes problèmes. Sur mon Homestead local, cela fonctionnerait comme prévu, mais après l'avoir poussé sur le serveur de développement, j'ai également reçu le message de délai de session. Constatant que c’est un problème d’environnement, j’ai changé d’Apache à nginx et qui a miraculeusement fait disparaître le problème.
En réalité, SCRF est un jeton de 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;
});
});
Par défaut je n'ai pas eu ce problème. Donc, ce que j’ai fait, c’est chmod -R 644 sessions
pour répliquer le problème.
Ensuite, j'ai donné les autorisations au dossier de sessions par chmod -R 755 sessions
maintenant mon code de projet fonctionne à nouveau.
La raison en est que vous stockez votre cache sur un fichier sans autorisation d'écriture
Le fichier de configuration de la session est stocké dans config/session.php. Être Veillez à examiner les options disponibles dans ce fichier. Par défaut, Laravel est configuré pour utiliser le pilote de session de fichier, qui fonctionnera bien pour de nombreuses applications. Dans les applications de production, vous pouvez Pensez à utiliser les pilotes memcached ou redis pour une session encore plus rapide performance.
Solutions:
1 - Comme je l’ai corrigé ci-dessus, vous pouvez donner 755 autorisations au dossier des sessions. 2 - Vous pouvez utiliser une autre configuration de pilote de session.
fichier - les sessions sont stockées dans storage/framework/sessions. biscuit - les sessions sont stockées dans des cookies sécurisés et cryptés. base de données - sessions sont stockés dans une base de données relationnelle. memcached/redis - les sessions sont stockés dans l’un de ces magasins rapides basés sur le cache. tableau - les sessions sont stockées dans un tableau PHP et ne seront pas persistées.
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.
Une mauvaise approche rapide consiste à accéder à app\http\middleware\verifycsrftoken.php et à 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',
];