webentwicklung-frage-antwort-db.com.de

Laravel Sitzung ändert sich immer bei jeder Aktualisierung/Anforderung Laravel 5.4

Der Titel sagt im Grunde alles, ich verwende Laravel 5.4, PHP 7.1 und auf meinen lokalen Rechnersitzungen funktionieren sie einwandfrei. Im Wesentlichen, wenn ich versuche, die Seite jedes Mal anzumelden oder neu zu laden, wenn ich ein neues CSRF-Token bekomme, das alles kaputt macht. Ich verwende die Datenbank als meinen Sitzungstreiber, und es wird bei jeder einzelnen Anforderung, die ich mache, ein neuer Eintrag in der Datenbank erstellt. Dies geschah auf meinem lokalen Rechner, als ich das erste Mal ein Upgrade durchführte. Um das Problem zu beheben, bestand die Lösung darin, meine env-Variable cookie_domain zu aktualisieren. Auf meinem neuen Server habe ich jedoch jede Domäne ausprobiert, die mir einfällt, und es funktioniert immer noch nicht. 

Hier ist was ich weiß

  • Sitzungscookies werden nicht unter Chrome -> Anwendung -> Cookies gespeichert. Dies wird in der lokalen Konfiguration tatsächlich angezeigt.

  • CSRF-TOKEN erhält bei jedem Neuladen der Seite einen neuen Wert. Der XSRF-TOKEN-Cookie ist jedoch vorhanden und behält seinen Wert bei jedem Neuladen bei.

  • Sowohl local als auch mein neuer Server verwenden genau denselben git-Zweig und beide führen Apache 2.4, Laravel 5.4 und PHP 7.1. Dies lässt mich davon ausgehen, dass es sich um ein Konfigurationsproblem handelt. Sowohl auf dem lokalen Server als auch auf dem Server werden Centos 7 ausgeführt

  • Jede Anforderung erstellt eine neue Sitzung in der Datenbank. Dies geschieht für Get-, Post- und Ajax-Anforderungen. 

Ich gehe davon aus, dass dies ein Konfigurationsproblem von irgendwo ist, aber ich habe keine Ahnung, jede Hilfe wäre sehr dankbar. Wenn es hilfreich ist, finden Sie unter meiner Antwort. Header für meine erste Seite laden. Sowohl Sid als auch die Laravel-Sitzung sind unter dem Befehl 'Set-Cookie' vorhanden, aber beide werden nicht in den lokalen Cookie-Speicher der Anwendung gespeichert. 

Bearbeiten/Aktualisieren Also habe ich ursprünglich meine eigene Frage mit dem gesagt, was ich dachte, war das Update, aber dieses Update funktioniert nicht mehr und ich bekomme dieses Problem überall. Um mein Problem zu aktualisieren, ist es das gleiche wie zuvor. Durch den Versuch, etwas zu tun, wird eine neue Sitzung erstellt. Durch das Neuladen und Navigieren einiger Seiten werden Dutzende von Sitzungen aufgrund von Ajax-Anforderungen und anderen Aktivitäten hinzugefügt.

Mein Setup ist das hier, ich habe 3 Server, alle drei laufen von einem geklonten Image ab, was bedeutet, dass sie identisch sind. Einer davon ist jedoch eine Subdomain, development.mysite.com und die anderen 2 sind für den Hauptsite-Server mysite ausgeglichen .com. Die EINZIGE mögliche Erklärung, die ich dazu bringen kann, ist, dass Laravel mein Setup aufgrund meiner Subdomain irgendwie nicht verstehen kann. Ich habe jede mögliche Kombination von COOKIE_DOMAIN in der .env-Datei ausprobiert (development.mysite.com, .mysite.com, mysite.com, .development.mysite.com usw.), und ich habe meinem Host Dutzende von Optionen hinzugefügt vermögen Irgendwelche Ideen, was das sein könnte? 

** Bearbeiten/Aktualisieren # 2 ** Darüber hinaus habe ich festgestellt, dass es sich bei meiner verwendeten Domäne um eine Unterdomäne handelt, in der die Hauptdomäne ebenfalls "Laravel" ist, wenn dies der Fall ist heraus wie und warum. 

13
CMOS

Ich fand die Lösung dafür 2 Teile, nicht sicher, warum es variierte, da es sich um dasselbe Betriebssystem und Setup handelte.

Schritt 1 Stellen Sie sicher, dass COOKIE_DOMAIN richtig und ohne Portnummern eingestellt ist (entweder in .env oder direkt in /config/session.php, je nachdem, was Sie verwenden). 

Schritt 2 Vergewissern Sie sich, dass der Cookie-Name ('cookie' => 'what')) in /config/sessions.php KEINEN Unterstrich enthält. Laravel hat anscheinend Probleme damit gehabt. 

4
CMOS

Wir haben diesen Fehler auch geworfen, und das scheint das Problem zu beheben: 

• Prüfen Sie, ob Ihr Ordner storage/ das richtige Recht hat

• Versuchen Sie, das gesamte Javascript auf Ihren Seiten zu deaktivieren (entweder durch Deaktivieren über den Navigator oder innerhalb des Codes), und stellen Sie sicher, dass 'http_only' => true,

• Versuchen Sie es mit und ohne https 

• Stellen Sie sicher, dass die Variable SESSION_DRIVER NICHT NULL ist

• Versuchen Sie, zwischen 'encrypt' => false, und 'encrypt' => true, zu wechseln.

• Versuchen Sie, den Cookie-Namen 'cookie' => 'laravelsession', zu ändern.

• Versuchen Sie entweder, Ihren SESSION_DOMAIN auf Ihre tatsächliche Domain OR zu setzen

• Versuchen Sie, zwischen 'secure' => env ('SESSION_SECURE_COOKIE', false) und 'secure' => env ('SESSION_SECURE_COOKIE', true) zu wechseln.

Nach jedem Schritt scheint dieser Fehler behoben zu sein, aber irgendwie wird der Cookie immer noch nicht im Navigator gesetzt, bis wir auch https für die Entwicklung verwenden.

Es tut mir leid, dass ich keine 100% ige Lösung anbieten kann, aber da ich genau das gleiche Problem habe, wollte ich meine Erfahrung mit Ihnen teilen.

5
Mathieu Ferre

Hauptursache für dieses Problem ist die Unfähigkeit von laravel, Sitzungsdaten auf dem Server zu speichern.

Mit Datei als Sitzungsspeicher kann dies ein Berechtigungsproblem sein. In der Regel ist [Berechtigung prüfen, ob Centos verwendet werden], Laravel (dh Apache oder Nginx oder der Benutzer, mit dem Ihr Prozess arbeitet) über Lese- und Schreibrechte für den Ordner wo Sitzungsdateien gespeichert werden [Dies ist normalerweise ein Projektstammordner/Speicherordner].

Ein weiterer Grund dafür kann sein, dass Sie die Datenbank als Sitzungsspeicher verwenden und die Sitzungstabelle manuell erstellt haben und den Fehler gemacht haben, eine id-Spalte vom Typ bigint (20) oder eine andere nicht übereinstimmende Spalte zu erstellen.

Das bedeutet wieder, dass laravel die Sitzungsdaten nicht speichern konnte. __ Überprüfen Sie meine ausführliche Antwort dazu hier https://stackoverflow.com/a/45340647/7260022

Der letzte Punkt betrifft die Einstellung von Cookies und Domains, wie oben erwähnt. Ich hoffe, dass dies hilft, das Problem für jeden zu bestimmen, der in Zukunft mit dem Problem zu kämpfen hat. 

1
Waku-2