web-dev-qa-db-de.com

PHP Sitzung nach Weiterleitung verloren

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.

109
dayuloli

Führen Sie zuerst diese üblichen Überprüfungen durch:

  1. Stellen Sie sicher, dass 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.
  2. Beenden Sie nach der 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.)
  3. Stellen Sie sicher, dass Cookies in dem Browser aktiviert sind, mit dem Sie sie testen.
  4. Stellen Sie sicher, dass 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.
  5. Stellen Sie sicher, dass Sie die Sitzung nicht gelöscht oder gelöscht haben
  6. Stellen Sie sicher, dass der Schlüssel in Ihrem $_SESSION Superglobal-Array nirgendwo überschrieben wird
  7. Stellen Sie sicher, dass Sie zur gleichen Domäne umleiten. Die Weiterleitung von einem www.yourdomain.com nach yourdomain.com führt die Sitzung also nicht weiter.
  8. Stellen Sie sicher, dass Ihre Dateierweiterung .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.)

175
dayuloli

sie sollten "exit" nach dem Aufruf der Kopfzeile verwenden

header('Location: http://www.example.com/?blabla=blubb');
exit;
21
KraftART Berlin

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 !

13
ali al-juanidi

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.

4
Jeremie

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.

3

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.

3
sclarky

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!

3
NicB

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.

2
Wynn

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.

1
Andy Huggins

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

1
Jayaprakash

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!

1

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

1
Gramrock

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:

  1. Festplattenspeicherproblem. Stellen Sie sicher, dass der Festplattenspeicher nicht voll ist. Sie benötigen Speicherplatz zum Speichern von Sitzungsdateien.

  2. Das Sitzungsverzeichnis ist möglicherweise nicht beschreibbar. Sie können es mit is_writable(session_save_path()) überprüfen.

0
F0G

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:

Android

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.

0
instead

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.

0
almisoft

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

0
Oscar

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
0
Robert Sinclair

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]
0
Vishal Kumar
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

0
ViperTecPro

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.

0
Julius S.

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.

0
temo

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
0
Jordan Daigle

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.

0
franzisk

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.

0
Björn Tantau

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")
0
user2999967

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

0
miapuffia

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.

0
Hristiyan Dodov

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;
0
Aubrey Kodar

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.

0
Stacker-flow

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

0
iperich

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. 

0
Yova Turnes

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');
0
Jack Nicholson