Wie löse ich das Problem, dass eine Sitzung nach einer Umleitung in PHP verloren geht?
Vor kurzem bin ich auf ein sehr häufiges Problem gestoßen, dass ich die Sitzung nach der Umleitung verloren habe. Und nach Durchsuchen dieser Website kann ich immer noch keine Lösung finden (obwohl dies kam am nächsten).
Update
Ich habe die Antwort gefunden und dachte, ich würde sie hier posten, um allen zu helfen, die das gleiche Problem haben.
Führen Sie zuerst diese üblichen Überprüfungen durch:
session_start();
aufgerufen wird, bevor Sitzungen aufgerufen werden. Eine sichere Wette wäre es also, sie an den Anfang Ihrer Seite zu setzen, unmittelbar nach der <?php
-Eröffnungsdeklaration. Stellen Sie außerdem sicher, dass vor der <?php
-Deklaration keine Leerzeichen/Tabulatoren vorhanden sind.header
-Umleitung das aktuelle Skript mit exit();
(Andere haben auch session_write_close();
und session_regenerate_id(true)
vorgeschlagen, Sie können diese auch ausprobieren, aber ich würde exit();
verwenden.)register_globals
ausgeschaltet ist. Sie können dies in der php.ini
-Datei und auch mit phpinfo()
überprüfen. Siehe this , um das Gerät auszuschalten.$_SESSION
Superglobal-Array nirgendwo überschrieben wirdwww.yourdomain.com
nach yourdomain.com
führt die Sitzung also nicht weiter..php
ist (es passiert!)Nun, dies sind die häufigsten Fehler, aber wenn sie den Trick nicht tun, ist das Problem am wahrscheinlichsten bei Ihrem Hosting-Unternehmen. Wenn alles auf localhost
, aber nicht auf Ihrem Remote-/Testserver funktioniert, ist dies höchstwahrscheinlich der Täter. Überprüfen Sie daher die Wissensdatenbank Ihres Hosting-Providers (probieren Sie auch deren Foren usw.). Für Unternehmen wie FatCow und iPage müssen Sie session_save_path
angeben. So wie folgt:
session_save_path('"your home directory path"/cgi-bin/tmp');
session_start();
(Ersetzen Sie "Ihren Home-Verzeichnispfad" durch Ihren tatsächlichen Home-Verzeichnispfad. Dies befindet sich normalerweise in Ihrem Control Panel (oder einem entsprechenden Element), Sie können jedoch auch eine test.php
-Datei in Ihrem Stammverzeichnis erstellen und Folgendes eingeben:
<?php echo $_SERVER['SCRIPT_FILENAME']; ?>
Das Bit vor 'test.php' ist der Pfad zum Basisverzeichnis. Vergewissern Sie sich natürlich, dass der Ordner tatsächlich in Ihrem Stammverzeichnis vorhanden ist. (Einige Programme laden beim Synchronisieren keine leeren Ordner hoch.)
sie sollten "exit" nach dem Aufruf der Kopfzeile verwenden
header('Location: http://www.example.com/?blabla=blubb');
exit;
Ich habe alle möglichen Lösungen ausprobiert, aber keine hat für mich funktioniert! Natürlich verwende ich einen Shared Hosting Service.
Am Ende bin ich das Problem umgangen, indem ich 'relative url' im umleitenden Header verwendet habe!
header("location: http://example.com/index.php")
löschte die Session-Cookies
header("location: index.php")
lief wie am Schnürchen !
Ich hatte das gleiche Problem. Ich habe mehrere Stunden daran gearbeitet und es hat mich verrückt gemacht.
In meinem Fall war das Problem eine 404, die wegen fehlender favicon.ico in Chrome und Firefox aufgerufen wurde. Die anderen Navigatoren funktionierten gut.
Ich hatte ein ähnliches Problem, obwohl mein Kontext etwas anders war ... Ich hatte eine lokale Entwicklungsumgebung auf einem Computer, dessen Hostname windows
und die IP-Adresse 192.168.56.2
war.
Ich konnte auf das System zugreifen mit:
Nach dem Anmelden würde mein PHP -Code mit folgender Adresse umleiten:
header('http://windows/');
Wenn der vorherige Domänenname, der für den Zugriff auf das System verwendet wurde, nicht windows
war, gehen die Sitzungsdaten verloren. Ich habe das Problem gelöst, indem ich den Code folgendermaßen geändert habe:
header('http://'.$_SERVER['HTTP_Host'].'/');
Es funktioniert jetzt unabhängig davon, welchen lokalen Domänennamen oder welche IP-Adresse der Benutzer eingibt.
Ich hoffe, das kann jemandem nützlich sein.
Dies hat mich lange Zeit gestohlen (und dieser Beitrag war toll zu finden!), Aber für alle anderen, die immer noch keine Sitzungen zwischen Seitenumleitungen zur Arbeit bekommen ... Ich musste in die php.ini-Datei gehen und Cookies einschalten :
session.use_cookies = 1
Ich dachte, die Sitzungen funktionierten ohne Cookies ... eigentlich weiß ich, dass sie SOLLTEN ... aber das hat mein Problem zumindest behoben, bis ich verstehen kann, was im größeren Bild vor sich geht.
Ich bin auf einer bestimmten Seite auf dieses Problem gestoßen. Ich habe vor der Umleitung auf anderen Seiten $ _SESSION-Werte festgelegt, und alles funktionierte einwandfrei. Aber diese bestimmte Seite hat nicht funktioniert.
Schließlich wurde mir klar, dass ich auf dieser Seite die Sitzung am Anfang der Seite zerstört habe, aber nie wieder angefangen habe. Meine Zerstörungsfunktion hat sich also geändert von:
function sessionKill(){
session_destroy();
}
zu:
function sessionKill(){
session_destroy();
session_start();
}
Und alles hat funktioniert!
Ich hatte das gleiche Problem. Plötzlich würden einige meiner Sitzungsvariablen nicht auf der nächsten Seite verbleiben. Das Problem stellte sich heraus (in php7.1), dass der Header-Speicherort kein WWW enthalten darf, z. B. ex https: // mysite . ist in Ordnung, https: //www.mysite . verliert die Sitzungsvariablen dieser Seiten. Nicht alles, nur diese Seite.
Wenn Sie session_set_cookie_params()
verwenden, möchten Sie vielleicht prüfen, ob Sie den vierten Parameter $secure
als true
übergeben. Wenn ja, müssen Sie über https auf die URL zugreifen.
Wenn $secure
param true ist, ist die Sitzung nur innerhalb einer sicheren Anfrage verfügbar. Dies kann Sie lokal stärker beeinträchtigen als in Bühnen- oder Produktionsumgebungen.
Erwähnen, weil ich 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 hat erwähnt, dass es https benötigt.
Sie können also entweder https lokal verwenden, oder Sie können $secure
param auf FALSE
setzen und dann lokal http verwenden. Stellen Sie sicher, dass Sie den Wert auf true zurücksetzen, wenn Sie Ihre Änderungen nach oben verschieben.
Abhängig von Ihrem lokalen Server müssen Sie möglicherweise DocumentRoot
im httpd-ssl.conf
des Servers bearbeiten, damit Ihre lokale URL https versorgt wird.
Ein anderer möglicher Grund:
Das ist mein Server-Speicherplatz. Mein Server-Festplattenspeicher wird voll. Also habe ich einige Dateien und Ordner auf meinem Server entfernt und ausprobiert.
Es hat geklappt !!!
Ich speichere meine Sitzung in AWS Dynamo DB, erwartet jedoch noch etwas Speicherplatz auf meinem Server, um die Sitzung zu verarbeiten. Nicht sicher warum!!!
Ich habe seit Tagen damit zu kämpfen, alle Lösungen geprüft/ausprobiert, aber mein Problem war, dass ich nach der Umleitung nicht wieder session_start();
anrief. Ich nahm einfach an, dass die Sitzung noch "am Leben" war.
Also vergiss das nicht!
Ich hatte das gleiche Problem und fand den einfachsten Weg ... Ich wurde einfach zu einer Weiterleitung .html mit 1 Zeile JS umgeleitet
<!DOCTYPE html>
<html>
<script type="text/javascript">
<!--
window.location = "admin_index.php";
//–>
</script>
</html>
anstelle von PHP
header_remove();
header('Location: admin_login.php');
die;
Ich hoffe das hilft.
Liebe Gramm
Stellen Sie zunächst sicher, dass Sie session_start()
aufrufen, bevor Sie die $_SESSION
-Variable verwenden.
Wenn Sie die Fehlerberichterstattung deaktiviert haben, schalten Sie sie ein und sehen Sie sich das Ergebnis an.
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Die häufigsten Gründe, die in der Antwort von @ dayuloli nicht erwähnt werden:
Festplattenspeicherproblem. Stellen Sie sicher, dass der Festplattenspeicher nicht voll ist. Sie benötigen Speicherplatz zum Speichern von Sitzungsdateien.
Das Sitzungsverzeichnis ist möglicherweise nicht beschreibbar. Sie können es mit is_writable(session_save_path())
überprüfen.
Schnelle und funktionierende Lösung für mich war einfach doppelte Weiterleitung. Ich habe 2 Dateien erstellt: fb-go.php
und fb-redirect.php
Wo fb-go.php
so aussah:
session_start();
$_SESSION['FBRLH_state'] = 'some_unique_string_for_each_call';
header('Location: fb-redirect.php');
und fb-redirect:
session_start();
header('Location: FULL_facebook_url_with_' . $_SESSION['FBRLH_state'] . '_value');
Erwähnenswert ist auch das Browserverhalten von AndroidChrome. Wo der Benutzer so etwas sehen kann:
Wenn der Benutzer die Facebook-App auswählt, geht die Sitzung verloren, da sie im Facebook-Browser geöffnet wird, nicht in Chrome, in dem die Sitzungsdaten des Benutzers gespeichert werden.
Für mich hat Firefox die Sitzungs-ID (PHPSESSID) in einem Cookie gespeichert, aber Google Chrome hat den Parameter GET oder POST verwendet .. Sie müssen also nur sicherstellen, dass das zurückkehrende Skript (für mich: Paypal Checkout) festgeschrieben wird PHPSESSID in URL oder Parameter POST.
Heute hatte ich dieses Problem in einem Projekt und musste diesen Parameter auf false ändern (oder die Zeilen entfernen, standardmäßig ist dies deaktiviert):
ini_set( 'session.cookie_secure', 1 );
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
OP hat nicht angegeben, ob er auf dieselbe Seite umleitet (z. B. nach der Anmeldung), wenn das Server-/Browser-Caching ebenfalls das Problem sein könnte
Eine einfache Problemumgehung besteht darin, die Versionsnummer am Ende der URL anzuhängen (wie beim Erzwingen der Aktualisierung von .CSS-Dateien).
Beispiel:
header('Location: index.php?v='.time());
So wird der Benutzer weitergeleitet, der wie eine neue Seite behandelt wird
domain.com/index.php?v=122234982323
Nachdem ich hier auf SO und anderen Blogs viele Lösungen ausprobiert hatte ... fügte ich hinzu, dass .htaccess zu meinem Website-Root hinzugefügt wurde.
RewriteEngine on
RewriteCond %{HTTP_Host} ^yoursitename.com$
RewriteRule ^.*$ "http\:\/\/www\.yoursitename\.com" [R=301,L]
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();
Für eine Antwort zu spät, aber das hat bei mir funktioniert
Nichts hat für mich funktioniert, aber ich habe herausgefunden, was das Problem verursacht hat (und es gelöst hat):
Überprüfen Sie die Cookies Ihres Browsers, und stellen Sie sicher, dass keine php-Sitzungscookies in verschiedenen Subdomains vorhanden sind (wie eines für " www.website.com " und eines für " website.com ").
Dies wurde durch ein Javascript verursacht, das die Subdomain fälschlicherweise dazu verwendete, Cookies zu setzen und Seiten in Iframes zu öffnen.
Für mich war das ein Berechtigungsfehler und das hat es gelöst:
chown -R nginx: nginx/var/opt/remi/php73/lib/php/session
Ich habe ein paar Stunden auf PHP getestet und als letzten Test habe ich zwei Dateien session1.php und session2.php erstellt.
session1.php:
session_start();
$_SESSION["user"] = 123;
header("Location: session2.php");
session2.php:
session_start();
print_r($_SESSION);
und es wurde ein leeres Array gedruckt.
Zu diesem Zeitpunkt dachte ich, es könnte sich um ein Serverproblem handeln, und tatsächlich war es dies.
Hoffe das hilft jemandem.
Stellen Sie sicher, dass session_write_close
nicht zwischen session_start()
und beim Einstellen Ihrer Sitzung aufgerufen wird.
session_start();
[...]
session_write_close();
[...]
$_SESSION['name']='Bob'; //<-- won't save
Das Problem wurde behoben, indem der Gruppe, in der PHP Sitzungsdateien speichert, Schreibberechtigungen für die Gruppe erteilt wird. Sie können den Sitzungspfad mit der Funktion session_save_path () finden.
Für mich bestand der Fehler darin, dass ich versuchte, ein nichtialisierbares Objekt in der Sitzung zu speichern, sodass beim Schreiben der Sitzung eine Ausnahme ausgelöst wurde. Da jedoch mein Fehlerbehandlungscode bereits eingestellt war, habe ich den Fehler nie gesehen.
Ich konnte es jedoch in den Apache-Fehlerprotokollen finden.
Wenn ich den relativen Pfad "dir/file.php" mit der Funktion header () 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 ...
//Does retain the session info for some reason
header("Location: dir");
//Does not retain the session for some reason
header("Location: https://mywebz.com/dir")
Ich habe dieses Problem nach vielen Tagen des Debugging behoben, und das war alles, weil meine von Paypal Express Checkout ausgehende Rückkehr-URL kein "www" hatte. Chrome hat erkannt, dass die Domänen gleich behandelt werden sollten, andere Browser jedoch nicht. Vergessen Sie bei der Verwendung von Sitzungen/Cookies und absoluten Pfaden nicht das 'www'!
Nun, da die DSGVO eine Sache ist, verwenden die Besucher dieser Frage wahrscheinlich ein Cookie-Skript. Nun, dieses Skript hat das Problem für mich verursacht. Anscheinend verwendet PHP ein Cookie namens PHPSESSID
, um die Sitzung zu verfolgen. Wenn dieses Skript es löscht, verlieren Sie Ihre Daten.
Ich habe dieses Cookie-Skript verwendet. Es gibt eine Option, um "wesentliche" Cookies zu aktivieren. Ich fügte PHPSESSID
zur Liste hinzu. Das Skript löschte den Cookie nicht mehr und alles begann wieder zu funktionieren.
Möglicherweise können Sie einige PHP -Einstellungen aktivieren, um die Verwendung von PHPSESSID
zu vermeiden. Wenn jedoch Ihr Cookie-Skript die Ursache des Problems ist, beheben Sie that.
Wenn Sie Laravel verwenden und dieses Problem auftritt, müssen Sie Ihre Sitzungsdaten vor dem Umleiten speichern.
session()->save();
// Redirect the user to the authorization URL.
header('Location: ' . $authorizationUrl);
exit;
Ich hatte auch das gleiche Problem, dass die Weiterleitung nicht funktionierte und versuchte alle Lösungen, die ich finden konnte, meine Header-Weiterleitung wurde in einem Formular verwendet.
Ich löste es, indem ich die Header-Weiterleitung in eine andere PHP-Seite 'signin_action.php' stellte und die Variablenparameter über I want in url -Parameter übergab und sie dann im Formular 'signin_action.php' neu zuordnet.
signin.php
if($stmt->num_rows>0) {
$_SESSION['username'] = $_POST['username'];
echo '<script>window.location.href = "http://'.$root.'/includes/functions/signin_action.php?username='.$_SESSION['username'].'";</script>';
error_reporting(E_ALL);
signin_action.php
<?php
require('../../config/init.php');
$_SESSION['username'] = $_GET['username'];
if ($_SESSION['username']) {
echo '<script>window.location.href = "http://'.$root.'/user/index.php";</script>';
exit();
} else {
echo 'Session not set';
}
?>
Es ist keine schöne Lösung, aber es hat funktioniert.
Nur fürs Protokoll ... Ich hatte dieses Problem und nach ein paar Stunden des Versuchens war alles das Problem, dass die Festplatte voll war und PHP-Sitzungen nicht in das tmp-Verzeichnis geschrieben werden konnten. Wenn Sie also dieses Problem haben, überprüfen Sie das auch...
Ich hatte das gleiche Problem und bin verrückt nach der Antwort in meinem Code gesucht. Schließlich fand ich, dass mein Hosting vor kurzem die PHP -Version auf meinem Server aktualisiert hat, und der session_save_path
-Parameter in der php.ini
-Datei nicht richtig eingerichtet wurde.
Wenn also jemand dies liest, überprüfen Sie php.ini
config vor allem anderen.
Wenn Sie Wordpress verwenden, musste ich diesen Haken hinzufügen und die Sitzung unter init starten:
function register_my_session() {
if (!session_id()) {
session_start();
}
}
add_action('init', 'register_my_session');