Wie löse ich das Problem, eine Sitzung nach einer Umleitung in PHP zu verlieren?
Vor kurzem stieß ich auf ein sehr häufiges Problem, bei dem die Sitzung nach der Umleitung verloren ging. Und nachdem ich diese Website durchsucht habe, kann ich immer noch keine Lösung finden (obwohl dies am nächsten kam).
Aktualisieren
Ich habe die Antwort gefunden und dachte, ich würde sie hier posten, um allen zu helfen, die das gleiche Problem haben.
php
session
redirect
session-cookies
shared-hosting
Dayuloli
quelle
quelle
Antworten:
Führen Sie zunächst die üblichen Überprüfungen durch:
session_start();
aufgerufen wird, bevor Sitzungen aufgerufen werden. Eine sichere Wette wäre es also, sie am Anfang Ihrer Seite unmittelbar nach der Eröffnungserklärung<?php
vor allem anderen zu platzieren. Stellen Sie außerdem sicher, dass vor der Eröffnungsdeklaration keine Leerzeichen / Tabulatoren vorhanden sind<?php
.header
Beenden Sie nach der Umleitung das aktuelle Skript mitexit();
(Andere haben ebenfalls vorgeschlagen,session_write_close();
undsession_regenerate_id(true)
Sie können diese auch ausprobieren, aber ich würde verwendenexit();
)register_globals
Sie sicher , dass diese Option deaktiviert ist. Sie können dies in derphp.ini
Datei überprüfen und auch verwendenphpinfo()
. Siehe dies , wie es auszuschalten.$_SESSION
Stellen Sie sicher, dass der Schlüssel in Ihrem superglobalen Array nirgendwo überschrieben wirdwww.yourdomain.com
nachyourdomain.com
führt die Sitzung also nicht weiter..php
(es passiert!)Nun, dies sind die häufigsten Fehler, aber wenn sie nicht den Trick gemacht haben, liegt das Problem höchstwahrscheinlich bei Ihrem Hosting-Unternehmen. Wenn alles funktioniert,
localhost
aber nicht auf Ihrem Remote- / Testserver, ist dies höchstwahrscheinlich der Schuldige. Überprüfen Sie daher die Wissensdatenbank Ihres Hosting-Anbieters (probieren Sie auch dessen Foren usw. aus). Für Unternehmen wie FatCow und iPage müssen Sie dies angebensession_save_path
. Also so:(Ersetzen Sie "Ihren Home-Verzeichnis-Pfad" durch Ihren tatsächlichen Home-Verzeichnis-Pfad. Dies befindet sich normalerweise in Ihrem Control Panel (oder einem gleichwertigen Pfad). Sie können jedoch auch eine
test.php
Datei in Ihrem Stammverzeichnis erstellen und Folgendes eingeben:Das Bit vor 'test.php' ist Ihr Home-Verzeichnispfad. Stellen Sie natürlich sicher, dass der Ordner tatsächlich in Ihrem Stammverzeichnis vorhanden ist. (Einige Programme laden beim Synchronisieren keine leeren Ordner hoch.)
quelle
Sie sollten "exit" nach dem Header-Aufruf verwenden
quelle
echo ' ';
) oder Leerzeichen jeglicher Art der Speicherort-Header vollständig ignoriert wird.Ich habe alle möglichen Lösungen ausprobiert, aber keine hat bei mir funktioniert! Natürlich benutze ich einen Shared Hosting Service.
Am Ende habe ich das Problem umgangen, indem ich 'relative url' im umleitenden Header verwendet habe!
Die Sitzungscookies wurden ungültig gemacht
Lief wie am Schnürchen !
quelle
Ich hatte das gleiche Problem. Ich habe mehrere Stunden daran gearbeitet und es hat mich verrückt gemacht.
In meinem Fall war das Problem ein 404, der aufgrund eines fehlenden favicon.ico nur in Chrome und Firefox aufgerufen wurde . Die anderen Navigatoren haben gut funktioniert.
quelle
Wenn ich den relativen Pfad "dir / file.php" mit in der header () Funktion verwende, funktioniert das für mich. Ich denke, dass die Sitzung aus irgendeinem Grund nicht gespeichert wird, wenn Sie mit der vollständigen URL umleiten ...
quelle
Das hat mich lange verblüfft (und dieser Beitrag war großartig zu finden!), Aber für alle anderen, die immer noch keine Sitzungen zwischen Seitenumleitungen zum Laufen bringen können ... Ich musste in die Datei php.ini gehen und Cookies aktivieren ::
Ich dachte, Sitzungen würden ohne Cookies funktionieren ... tatsächlich weiß ich, dass sie SOLLTEN ... aber dies hat mein Problem behoben, zumindest bis ich verstehen kann, was im Großen und Ganzen vor sich geht.
quelle
Ich hatte ein ähnliches Problem, obwohl mein Kontext etwas anders war. Ich hatte ein lokales Entwicklungssetup auf einem Computer, dessen Hostname
windows
und IP-Adresse lauteten192.168.56.2
.Ich kann auf eines der folgenden Systeme zugreifen:
Nach dem Anmelden wird mein PHP-Code umgeleitet mit:
Wenn der vorherige Domänenname für den Zugriff auf das System nicht verwendet wurde
windows
, gehen die Sitzungsdaten verloren. Ich habe dies gelöst, indem ich den Code geändert habe in:Es funktioniert jetzt unabhängig davon, welchen lokalen Domänennamen oder welche IP-Adresse der Benutzer eingibt.
Ich hoffe, dass dies für jemanden nützlich sein kann.
quelle
Ich bin auf einer bestimmten Seite auf dieses Problem gestoßen. Ich habe $ _SESSION-Werte auf anderen Seiten direkt vor der Umleitung festgelegt und alles hat einwandfrei funktioniert. Aber diese spezielle Seite funktionierte nicht.
Schließlich wurde mir klar, dass ich auf dieser bestimmten Seite die Sitzung am Anfang der Seite zerstörte, sie aber nie wieder startete. Also hat sich meine Zerstörungsfunktion geändert von:
zu:
Und alles hat funktioniert!
quelle
Ich hatte das gleiche Problem. Plötzlich würden einige meiner Sitzungsvariablen nicht mehr auf der nächsten Seite angezeigt. Es stellte sich heraus, dass (in PHP7.1) Ihr Header-Speicherort kein WWW enthalten darf, z . B. https: // mysite . ist in Ordnung, https: //www.mysite . wird diese Seiten Sitzungsvariablen verlieren. Nicht alle, nur diese Seite.
quelle
www.mysite.com
es als eine völlig andere Domäne angesehen wird alsblog.mysite.com
oder einfachmysite.com
Ich habe seit Tagen damit zu kämpfen und alle Lösungen überprüft / ausprobiert, aber mein Problem war, dass ich
session_start();
nach der Umleitung nicht mehr angerufen habe . Ich habe nur angenommen, dass die Sitzung "noch am Leben" ist.Also vergiss das nicht!
quelle
Ich hatte das gleiche Problem und fand den einfachsten Weg. Ich habe einfach zu einer Weiterleitungs-HTML mit 1 Zeile JS umgeleitet
anstelle von PHP
Ich hoffe das hilft.
Liebesgramm
quelle
Wenn Sie verwenden
session_set_cookie_params()
, möchten Sie möglicherweise überprüfen, ob Sie den vierten Parameter$secure
als übergebentrue
. Wenn ja, müssen Sie über https auf die URL zugreifen.Der
$secure
Parameter true bedeutet, dass die Sitzung nur innerhalb einer sicheren Anforderung verfügbar ist. Dies kann Sie lokal stärker betreffen als in Bühnen- oder Produktionsumgebungen.Ich erwähne es, weil ich heute den größten Teil des heutigen Tages damit verbracht habe, dieses Problem zu finden, und das hat es für mich gelöst. Ich wurde gerade zu diesem Projekt hinzugefügt und niemand erwähnte, dass es https benötigt.
Sie können also entweder https lokal verwenden oder den
$secure
Parameter auf setzenFALSE
und dann http lokal verwenden. Stellen Sie einfach sicher, dass es wieder auf true gesetzt ist, wenn Sie Ihre Änderungen nach oben verschieben.Abhängig von Ihrem lokalen Server, können Sie zu bearbeiten haben
DocumentRoot
in demhttpd-ssl.conf
von dem Server , so dass Ihre lokale URL https serviert wird .quelle
Ein weiterer möglicher Grund:
Das ist mein Serverspeicherplatz. Mein Server-Speicherplatz wird voll. Also habe ich einige Dateien und Ordner auf meinem Server entfernt und versucht.
Es hat funktioniert !!!
Ich speichere meine Sitzung in AWS Dynamo DB, erwarte jedoch weiterhin Speicherplatz auf meinem Server, um die Sitzung zu verarbeiten. Nicht sicher warum!!!
quelle
Wenn Sie Laravel verwenden und dieses Problem auftritt, müssen Sie Ihre Sitzungsdaten vor der Umleitung speichern.
quelle
Ich hatte auch das gleiche Problem mit der nicht umleitenden Umleitung und versuchte alle Lösungen, die ich finden konnte. Meine Header-Umleitung wurde in einem Formular verwendet.
Ich habe es gelöst, indem ich die Header-Umleitung in eine andere PHP-Seite 'signin_action.php' eingefügt und die gewünschten Variablenparameter in URL-Parametern übergeben und sie dann im Formular 'signin_action.php' neu zugewiesen habe.
signin.php
signin_action.php
Es ist keine schöne Lösung, aber es hat funktioniert.
quelle
Für mich war der Fehler, dass ich versucht habe, ein unserialisierbares Objekt in der Sitzung zu speichern, sodass beim Schreiben der Sitzung eine Ausnahme ausgelöst wurde. Da jedoch mein gesamter Fehlerbehandlungscode bereits alle Vorgänge eingestellt hatte, wurde der Fehler nie angezeigt.
Ich konnte es jedoch in den Apache-Fehlerprotokollen finden.
quelle
Nur zur Veranschaulichung ... Ich hatte dieses Problem und nach ein paar Stunden, in denen ich alles ausprobiert hatte, bestand das Problem darin, dass die Festplatte voll war und PHP-Sitzungen nicht in das tmp-Verzeichnis geschrieben werden konnten. Wenn Sie dieses Problem haben, überprüfen Sie dies auch...
quelle
www
). Durch die Ausführungchown -R www.www
des Sitzungsordners wird das Problem behoben.Für mich hat Firefox die Sitzungs-ID (PHPSESSID) in einem Cookie gespeichert, aber Google Chrome hat die Parameter GET oder POST verwendet. Sie müssen also nur sicherstellen, dass das zurückkehrende Skript (für mich: Paypal Checkout) PHPSESSID in URL- oder POST-Parametern festschreibt.
quelle
Nachdem ich hier in SO und anderen Blogs viele Lösungen ausprobiert hatte, funktionierte es für mich, .htaccess zu meinem Website-Stammverzeichnis hinzuzufügen.
quelle
Wenn Sie Wordpress verwenden, musste ich diesen Hook hinzufügen und die Sitzung auf init starten:
quelle
Bei mir hat nichts funktioniert, aber ich habe herausgefunden, was das Problem verursacht hat (und es gelöst):
Überprüfen Sie die Cookies Ihres Browsers und stellen Sie sicher, dass keine PHP-Sitzungscookies in verschiedenen Subdomains vorhanden sind (z. B. eines für " www.website.com " und eines für " website.com ").
Dies wurde durch ein Javascript verursacht, das die Subdomain fälschlicherweise zum Setzen von Cookies und zum Öffnen von Seiten in Iframes verwendete.
quelle
Stellen Sie zunächst sicher, dass Sie aufrufen,
session_start()
bevor Sie eine$_SESSION
Variable verwenden.Wenn Sie die Fehlerberichterstattung deaktiviert haben, versuchen Sie, sie einzuschalten und das Ergebnis anzuzeigen.
Die häufigsten Gründe, die in der Antwort von @ dayuloli nicht erwähnt werden:
Speicherplatzproblem. Stellen Sie sicher, dass Ihr Speicherplatz nicht voll ist. Sie benötigen Speicherplatz zum Speichern von Sitzungsdateien.
Das Sitzungsverzeichnis ist möglicherweise nicht beschreibbar. Sie können es mit überprüfen
is_writable(session_save_path())
quelle
Ich hatte das gleiche Problem und war verrückt, als ich in meinem Code nach der Antwort suchte. Schließlich stellte ich fest, dass mein Hosting kürzlich die PHP-Version auf meinem Server aktualisiert und den
session_save_path
Parameter in derphp.ini
Datei nicht korrekt eingerichtet hat .Wenn jemand dies liest, überprüfen Sie bitte die
php.ini
Konfiguration vor allem anderen.quelle
Stellen Sie sicher
session_write_close
, dass zwischensession_start()
und beim Festlegen Ihrer Sitzung kein Aufruf erfolgt .quelle
Nun, da GDPR eine Sache ist, verwenden Leute, die diese Frage besuchen, wahrscheinlich ein Cookie-Skript. Nun, dieses Skript hat das Problem für mich verursacht. Anscheinend verwendet PHP ein Cookie, das aufgerufen wird
PHPSESSID
, um die Sitzung zu verfolgen. Wenn dieses Skript es löscht, verlieren Sie Ihre Daten.Ich habe dieses Cookie-Skript verwendet . Es besteht die Möglichkeit, "wichtige" Cookies zu aktivieren. Ich fügte
PHPSESSID
der Liste hinzu, das Skript löschte das Cookie nicht mehr und alles begann wieder zu funktionieren.Sie könnten wahrscheinlich einige PHP Einstellung aktivieren zu vermeiden , mit
PHPSESSID
, aber wenn Sie Ihr Cookie - Skript die Ursache des Problems ist, warum nicht beheben , dass .quelle
Ich habe dieses Problem nach vielen Tagen des Debuggens behoben und alles nur, weil meine Rückgabe-URL von PayPal Express Checkout kein "www" hatte. Chrome hat erkannt, dass die Domains gleich behandelt werden sollten, andere Browser jedoch manchmal nicht. Vergessen Sie bei der Verwendung von Sitzungen / Cookies und absoluten Pfaden nicht das 'www'!
quelle
Ich habe das Problem behoben, indem ich Gruppenschreibberechtigungen für den Pfad erteilt habe, in dem PHP Sitzungsdateien speichert. Sie finden den Sitzungspfad mit der Funktion session_save_path ().
quelle
Heute hatte ich dieses Problem in einem Projekt und musste diesen Parameter in false ändern (oder die Zeilen entfernen, standardmäßig ist deaktiviert):
Dies geschah, weil das eigentliche Projekt über http und nicht nur über https funktioniert. Weitere Informationen finden Sie in den Dokumenten http://php.net/manual/en/session.security.ini.php
quelle
Zu spät, um zu antworten, aber das hat bei mir funktioniert
quelle
Für mich war dies ein Berechtigungsfehler, der ihn behoben hat:
Ich habe einige Stunden auf PHP getestet und als letzten Test habe ich zwei Dateien session1.php und session2.php erstellt.
session1.php:
session2.php:
und es wurde ein leeres Array gedruckt.
Zu diesem Zeitpunkt dachte ich, es könnte ein Serverproblem sein, und tatsächlich war es das auch.
Hoffe das hilft jemandem.
quelle