webentwicklung-frage-antwort-db.com.de

Veröffentlichen Sie die Anfrage in Laravel 5.7 --- Fehler - 419 Ihre Sitzung ist leider abgelaufen

Ich habe Laravel 5.7 installiert

Ein Formular zur Datei \resources\views\welcome.blade.php hinzugefügt

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

Zur Datei \routes\web.php hinzugefügt

Route::post('/foo', function () {
    echo 1;
    return;
});

Nach dem Senden einer POST - Anforderung:

419 Ihre Sitzung ist leider abgelaufen. Bitte aktualisieren Sie und versuchen Sie es erneut.

In der Version 5.6 gab es kein solches Problem.

Bevor Sie weiter unten lesen, stellen Sie sicher, dass Sie @csrf oder {{ csrf_field() }} in Ihrem Formular Mögen 

<form method="post">
@csrf <!-- {{ csrf_field() }} -->
... rest of form ...
</form>

Die Fehlermeldung zum Ablauf der Sitzung ist abgelaufen, da die Überprüfung Ihres csrf-Token fehlschlägt, was bedeutet, dass die App\Http\Middleware\VerifyCsrfToken::class-Middleware bereits aktiviert ist. In der Form ist bereits die @csrf-Blade-Direktive hinzugefügt, die ebenfalls in Ordnung sein sollte.

Der andere zu überprüfende Bereich ist die Sitzung. Die csrf-Tokenüberprüfung ist direkt mit Ihrer Sitzung verbunden. Sie sollten also prüfen, ob Ihr Sitzungstreiber funktioniert oder nicht. Ein falsch konfiguriertes Redis-Programm kann zu Problemen führen.

Vielleicht können Sie versuchen, Ihren Sitzungstreiber/Ihre Sitzungssoftware von Ihrer .env-Datei zu wechseln. Die unterstützten Treiber sind unten aufgeführt

Unterstützte Sitzungstreiber in Laravel 5.7(Doc Link)

  • file - Sitzungen werden in Speicher/Framework/Sitzungen gespeichert. 
  • cookie - Sitzungen werden in sicheren, verschlüsselten Cookies gespeichert.
  • database - Sitzungen werden in einer relationalen Datenbank gespeichert. 
  • memcachedredis - Sitzungen werden in einem dieser schnellen, Cache-basierten Speicher gespeichert.
  • array - Sitzungen werden in einem PHP - Array gespeichert und werden nicht persistent gehalten.

Wenn Ihr Formular nach dem Wechseln des Sitzungstreibers funktioniert, liegt ein Problem mit diesem Treiber vor. Versuchen Sie, den Fehler von dort zu beheben.

_/Mögliche fehleranfällige Szenarien

  • Dateibasierte Sitzungen funktionieren möglicherweise aufgrund von Berechtigungsproblemen mit dem Verzeichnis /storage möglicherweise nicht (eine schnelle Suche bringt Sie zur Lösung)

  • Im Fall des Datenbanktreibers ist Ihre DB-Verbindung möglicherweise falsch oder die Tabelle sessions ist nicht vorhanden oder falsch konfiguriert (der falsche Konfigurationsteil wurde gemäß dem Kommentar von @Junaid Qadir als Problem eingestuft).

  • Die redis/memcached-Konfiguration ist falsch oder wird gleichzeitig von einem anderen Code im System bearbeitet.

Es kann eine gute Idee sein, php artisan key:generate auszuführen und einen neuen App-Schlüssel zu generieren, der die Sitzungsdaten löscht. 

Browser-Cache löschen HARD, ich habe festgestellt, dass Chrome und Firefox mehr Schuld daran sind, als ich mich erinnern kann.

Lesen Sie mehr darüber, warum Anwendungsschlüssel wichtig sind

21
Shobi

Dies liegt daran, dass das Formular eine CSRF erfordert. In Version 5.7 wurde sie in @csrf geändert

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

Referenz: https://laravel.com/docs/5.7/csrf

12
David

Wie wäre es mit

{{ csrf_field() }} anstelle von @csrf

Der Fehler 419 ist hauptsächlich auf Csrf-Token-Probleme zurückzuführen.

4
Bonish Koirala

Ich benutze Laravel 5.7. Ich hatte das gleiche Problem und das lag daran, dass das csrf-Token nicht in der Form war

@csrf

das Problem behoben

4
Karim Samir

fall 1: Wenn Sie ein Projekt in Ihrem lokalen System ausführen, wie 127.0.01: 8000

dann 

fügen Sie SESSION_DOMAIN= in Ihre .env-Datei ein

oder in deiner config/session.php 'domain' => env('SESSION_DOMAIN', ''),

und dann php artisan cache:clear ausführen

fall 2: Wenn das Projekt auf dem Server ausgeführt wird und Sie eine Domäne wie .__ haben. "mydomain.com"

fügen Sie SESSION_DOMAIN=mydomain.com in Ihre .env-Datei ein

oder in deiner config/session.php 'domain' => env('SESSION_DOMAIN', 'mydomain.com'),

und dann php artisan cache:clear ausführen

2
Saurabh Mistry

Ändern Sie Ihren @csrf in welcome.blade.php in <input type="hidden" name="_token" value="{{ csrf_token() }}">.

also dein code so:

<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>
2
Aghnat Atqiya

Nach so viel Zeit habe ich es auf diese Weise gelöst

Mein laravel Installationspfad stimmte nicht mit dem in der Konfigurationsdatei session.php festgelegten überein

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

Sie haben das CSRF-Feld falsch hinzugefügt. Anstelle von @csrf sollten Sie csrf_field() folgendermaßen verwenden:

<form method="POST" action="/foo" >
    {{ csrf_field() }}
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>
1
Istiyak Amin

Versuchen Sie, \App\Http\Middleware\EncryptCookies::class in \app\Http\Kernel.php.__ auszukommentieren. Ich habe ein ähnliches Problem gelöst und es dadurch gelöst.

Früher habe ich versucht:

  • Cache leeren
  • Neuen App-Schlüssel generieren
  • Meine App in verschiedenen Browsern ausführen (Chrome 70, Mozilla Firefox 57 und IE 11)
  • Führen Sie meine App auf einem anderen Computer aus
  • \App\Http\Middleware\VerifyCsrfToken::class in \app\Http\Kernel.php auskommentieren
  • \Illuminate\Session\Middleware\AuthenticateSession::class in \app\Http\Kernel.php auskommentieren
  • Upgrade und Downgrade von Laravel (zwischen 5.6 und 5.7)

Aber nichts davon hat für mich funktioniert.

1
Prasna Lukito

Ich hatte gerade das gleiche Problem und es lag an mir, völlig dumm zu sein. Ich hatte vor dem Absenden des Formulars alle Formularfelder (und nicht nur den Senden-Button) über Javascript deaktiviert! Dies führte natürlich dazu, dass nicht alle Formularelemente übermittelt wurden (einschließlich des ausgeblendeten _token-Felds), was wiederum den Fehler 419 zur Folge hatte!

Ich hoffe das hilft jemandem ein paar Stunden am Kopf kratzen!

Deaktivierte Formulareingaben erscheinen nicht in der Anfrage

0
Splodge

In meinem Fall ist es sehr lächerlich. Ich erhalte die Fehlermeldung 419, wenn ich Auth::routes() oben in die Routendatei einfüge.

Auth::routes();

Route::middleware('auth')->group(function () {
    Route::get('/', '[email protected]')->name('dashboard');
});

Und ich habe den Fehler behoben, indem ich Auth::routes(); an das Ende der Routendatei verschoben habe.

Route::middleware('auth')->group(function () {
    Route::get('/', '[email protected]')->name('dashboard');
});

Auth::routes();

Vielleicht kann es auch Ihrem Fall helfen. Viel Glück.

0
lyhong

Es gibt kein Problem im Code. Ich habe mit demselben Code überprüft, den Sie bei der Neuinstallation geschrieben haben.

Formularcode:

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

web.php datei code:

Route::get('/', function () {
    return view('welcome');
});

Route::post('/foo', function () {
    echo 1;
    return;
});

Nach dem Absenden des Formulars lautet das Ergebnis:  Output after submitting the form

Wenn Sie den Cache Ihres Browsers löschen oder einen anderen Browser verwenden, wird er wahrscheinlich behoben.

0

Bei Laravel 5.6 oder höher können Sie keine leere Rückgabe durchführen. Laravel erwartet immer, dass ein Wert zurückgegeben wird. (Ich weiß aus Erfahrung) ..__ Dies hat hauptsächlich damit zu tun, wie PHP 7 leere Rückgaben behandelt.

0
Jamie Ross

Es kann übertrieben sein, aber Sie können dies versuchen:

// Formular aufrufen named route mit hinzugefügtem versteckten Tokenfeld.

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

// Named Route

Route::post('/foo', function () {
    return 'bar';
})->name('foo');

// Füge dies im <head></head>-Block hinzu:

<meta name="_token" content="{!! csrf_token() !!}" />

Ich habe es auf meinem Local mit Homestead auf Laravel 5.7 getestet, das war neu installiert mit Laravel Installer 2.0.1 und es hat funktioniert. Wie ist deine Umgebung?

Theorie: Ich frage mich, ob das etwas mit Blade-Rendering-HTML-Tags mit {{ }} vs. {!! !!} in Ihrer Umgebung zu tun hat oder wie Sie es bedienen (zB php artisan serve). Was bringt mich dazu, zu denken, dass line 335 von /vendor/laravel/framework/src/illuminate/Foundation/helpers.php die selbe Zeile, die oben manuell eingegeben wurde, wiedergibt? 

0
jeremykenedy

Ich habe dieses Problem vor langer Zeit bekommen. Ich erinnere mich, es verursacht die Erlaubnis von storage/framework/sessions. Sie können es ändern, indem Sie chmod -R 0777 storage/framework/sessions Befehl. Es hat bei mir funktioniert.

0
Leo Nguyen

Beachten Sie, dass der Fehler 419 angezeigt wird, wenn Sie versuchen, eine große Datei hochzuladen, die die Größenbeschränkung für Post-Dateien überschreitet. In diesem Fall können Sie sowohl upload_max_filesize als auch post_max_size auf einen angemessenen Wert erhöhen (z. B. 10 Millionen oder 20 Millionen, abhängig von Ihrem Anwendungsfall und Ihren Ressourcen). Überprüfen Sie dies hier: https://stackoverflow.com/a/2184541/2100489

Dies kann jedoch zu Problemen beim Ressourcenverbrauch führen, z. B. zu Bandbreiten- und Speicherproblemen. Als Lösung können Sie die Dateigröße vor dem Absenden des Formulars überprüfen und eine Warnmeldung anzeigen.

0
Kiafar

In Ihrem Http/Kernel.php

versuchen Sie, diese Zeile zu kommentieren: 

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

in Ihrem Web-Middleware-Array

es könnte die Wurzel Ihres Problems sein

0
Mathieu Ferre

Nur um es herauszubringen, hatte ich die gleichen Probleme. Auf meinem lokalen Homestead würde es wie erwartet funktionieren, aber nachdem ich es auf den Entwicklungsserver gepusht hatte, erhielt ich auch die Sitzungszeitüberschreitungsmeldung. Da ich ein Umweltproblem gefunden habe, habe ich von Apache zu Nginx gewechselt und das hat das Problem auf wundersame Weise gelöst.

0
Kees Hessels

Eigentlich ist SCRF ein sitzungsbasiertes Token. Fügen Sie Ihre Route einer Routengruppe hinzu und fügen Sie eine Middleware hinzu, die die Sitzungen steuert.

web ist eine Standard-Middleware in laravel und kann die Sitzungsanforderungen steuern.

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

In der Regel hatte ich dieses Problem nicht. Also habe ich chmod -R 644 sessions, um das Problem zu replizieren. 

 enter image description here

Anschließend erteilte ich Berechtigungen für den Sitzungsordner von chmod -R 755 sessions.

jetzt funktioniert mein projektcode wieder.

 enter image description here

Grund dafür ist, dass Sie Ihren Cache in der Datei ohne Schreibberechtigung Speichern.

Die Sitzungskonfigurationsdatei wird in config/session.php gespeichert. Sein Stellen Sie sicher, dass Sie die verfügbaren Optionen in dieser Datei überprüfen. Standardmäßig, Laravel ist für die Verwendung des Dateisitzungstreibers konfiguriert, der funktionieren wird gut für viele Anwendungen. In Produktionsanwendungen können Sie Verwenden Sie die memcached- oder redis-Treiber für eine noch schnellere Sitzung Performance.

Lösungen:

1 - Wie ich oben behoben habe, können Sie dem Ordner "Sessions" 755 die Berechtigung erteilen. 2 - Sie können eine andere Sitzungstreiberkonfiguration verwenden. 

datei-Sitzungen werden in Speicher/Framework/Sitzungen gespeichert. Cookie - Sitzungen werden in sicheren, verschlüsselten Cookies gespeichert. Datenbank - Sitzungen werden in einer relationalen Datenbank gespeichert. Memcached/Redis - Sitzungen sind in einem dieser schnellen, Cache-basierten Speicher gespeichert. Array - Sitzungen sind gespeichert in einem PHP - Array und wird nicht persistiert.

Denken Sie daran. Wenn Sie memcached/redis verwenden möchten, müssen diese auf Ihrem Server installiert sein oder der Docker-Redis-Container muss ausgeführt werden.

0
Anar Bayramov

Ein schneller Ansatz ist, dass Sie zu app\http\middleware\verifycsrftoken.php gehen und die Route in $ mit Ausnahme der Liste hinzufügen. Die Post-Anfrage wird für die Überprüfung des CSRF-Token ignoriert.

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