PHP-Sitzung nach Umleitung verloren

131

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.

Dayuloli
quelle
1
Die Frage ist, wie das Problem des Verlusts einer Sitzung nach einer Umleitung in PHP gelöst werden kann. Ich habe die Antwort bereits herausgefunden und sie hier veröffentlicht, um andere darüber zu informieren. Weil meine Lösung nicht auf StackOverflow basiert.
Dayuloli
2
Das ist in Ordnung, aber dies ist eine QS-Site. Bitte machen Sie Ihre Frage zu einer Frage.
Jeremy
Ich habe nicht bemerkt, dass es von dir war. Diese Seite ist jedoch für Fragen gedacht, nicht für Antworten auf Fragen, die Sie bereits kennen.
Aris
21
@Aris Das stimmt nicht, wenn Leute eine Frage zum Codieren haben, kommen sie zu StackOverflow, um Hilfe zu erhalten. Wenn keine Antworten verfügbar sind, können sie nicht die Hilfe erhalten, die sie benötigen. Ich versuche diese Antwort zu geben.
Dayuloli

Antworten:

208

Führen Sie zunächst die ü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 am Anfang Ihrer Seite unmittelbar nach der Eröffnungserklärung <?phpvor allem anderen zu platzieren. Stellen Sie außerdem sicher, dass vor der Eröffnungsdeklaration keine Leerzeichen / Tabulatoren vorhanden sind <?php.
  2. headerBeenden Sie nach der Umleitung das aktuelle Skript mit exit();(Andere haben ebenfalls vorgeschlagen, session_write_close();und session_regenerate_id(true)Sie können diese auch ausprobieren, aber ich würde verwenden exit();)
  3. Stellen Sie sicher, dass Cookies in dem Browser aktiviert sind, in dem Sie sie testen.
  4. Stellen register_globalsSie sicher , dass diese Option deaktiviert ist. Sie können dies in der php.iniDatei überprüfen und auch verwenden phpinfo(). Siehe dies , wie es auszuschalten.
  5. Stellen Sie sicher, dass Sie die Sitzung nicht gelöscht oder geleert haben
  6. $_SESSIONStellen Sie sicher, dass der Schlüssel in Ihrem superglobalen Array nirgendwo überschrieben wird
  7. Stellen Sie sicher, dass Sie zur gleichen Domain umleiten. Das Umleiten von a www.yourdomain.comnach yourdomain.comführt die Sitzung also nicht weiter.
  8. Stellen Sie sicher, dass Ihre Dateierweiterung ist .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, localhostaber 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 angeben session_save_path. Also so:

session_save_path('"your home directory path"/cgi-bin/tmp');
session_start();

(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.phpDatei in Ihrem Stammverzeichnis erstellen und Folgendes eingeben:

<?php echo $_SERVER['SCRIPT_FILENAME']; ?>

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

Dayuloli
quelle
8
Sehr gut geschrieben +1, wenn alles fehlschlägt, verwenden Sie einfach Cookies (generieren Sie zufällig eine Zeichenfolge und speichern Sie sie in der Datenbank und verwenden Sie diese als Cookie-Wert).
Dave Chen
2
Das Wechseln zwischen http und n https kann auch ein Problem sein. stackoverflow.com/questions/441496/…
dev.e.loper
4
Beachten Sie, dass ab PHP 5.4.0 register_globals entfernt wurde, so dass es kein Problem mehr verursacht
Anthonygore
2
Überprüfen Sie auch das Webserver-Fehlerprotokoll. In meinem Fall ist der Fehler "Sitzungsdaten (Dateien) konnten nicht geschrieben werden. Überprüfen Sie, ob die aktuelle Einstellung von session.save_path korrekt ist" aufgetreten. Die Berechtigungen für das Verzeichnis save_path waren falsch.
Timbonicus
Gibt es einen Grund, warum meine Sitzungen an einem anderen Ort als in session.save_path gespeichert werden?
Justin
26

Sie sollten "exit" nach dem Header-Aufruf verwenden

header('Location: http://www.example.com/?blabla=blubb');
exit;
KraftART Berlin
quelle
Es gibt einen Fehler bei Gecko (z. B. Waterfox, Firefox, SeaMonkey), bei dem bei einer Datenausgabe (z. B. echo ' ';) oder Leerzeichen jeglicher Art der Speicherort-Header vollständig ignoriert wird.
John
18

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!

header("location: http://example.com/index.php")

Die Sitzungscookies wurden ungültig gemacht

header("location: index.php")

Lief wie am Schnürchen !

ali al-juanidi
quelle
7

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.

Jeremie
quelle
Ich wollte mich nur für diese Antwort bedanken und habe festgestellt, dass 404 Anfragen nach Bildern von Varnish ohne Cookies an PHP weitergeleitet wurden und daher ständig neue Sitzungen erstellt wurden. Vielleicht hätte ich es ohne dich nie herausgefunden.
Pascal Zajac
Ich hatte das gleiche Problem, mein favicon.ico wurde umgeleitet (302 Weiterleitung von der Subdomain zur Hauptdomain) und generierte daher jedes Mal eine neue Sitzung. Vielen Dank!
Simdrouin
4

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

//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")
user2999967
quelle
3

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

session.use_cookies = 1 

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.

sclarky
quelle
Ich wusste nicht, dass Sitzungen ohne Cookies funktionieren können! Lerne jeden Tag etwas Neues! programmerinterview.com/index.php/php-questions/…
Dayuloli
Natürlich können sie ohne Cookies funktionieren, abhängig von Ihrer Konfiguration. Aber Sie sollten wissen, was Sie tun. Und haben Sie einen guten Grund dafür. Weil es weniger sicher ist. und für den Fall, dass Sie aus irgendeinem Grund ohne Cookies arbeiten müssen. Sie sollten mindestens ini_set konfigurieren ('session.use_strict_mode', '1'); und haben im Allgemeinen eine kurze Sitzungszeit und verwenden Sie nach der Benutzeranmeldung session_regenerate_id (). Aber seien Sie gewarnt, wenn ein Benutzer einen Link zu einer Site auf Ihrem Server in einem Forum veröffentlicht, übernehmen die Leute, die tatsächlich auf diesen Link klicken, die Sitzung. Vielleicht ist es auch eine gute Idee, die IP zu überprüfen.
Michael
3

Ich hatte ein ähnliches Problem, obwohl mein Kontext etwas anders war. Ich hatte ein lokales Entwicklungssetup auf einem Computer, dessen Hostname windowsund IP-Adresse lauteten 192.168.56.2.

Ich kann auf eines der folgenden Systeme zugreifen:

Nach dem Anmelden wird mein PHP-Code umgeleitet mit:

header('http://windows/');

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:

header('http://'.$_SERVER['HTTP_HOST'].'/');

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.

Stephen K. Karanja
quelle
3

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:

function sessionKill(){

    session_destroy();

}

zu:

function sessionKill(){

    session_destroy();
    session_start();

}

Und alles hat funktioniert!

NicB
quelle
3

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.

Wynn
quelle
Das liegt daran, dass www.mysite.comes als eine völlig andere Domäne angesehen wird als blog.mysite.comoder einfachmysite.com
Dayuloli
2

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!

Jeffrey Roosendaal
quelle
Ja! Das war auch mein Problem. Ich dachte, das Starten einer PHP-Sitzung wäre wie das Einschalten eines Lichts für das ganze Haus. Ich wusste nicht, dass Sie den Schalter für jeden Raum, den Sie betreten, drehen müssen.
Dale Thompson
1

Ich hatte das gleiche Problem und fand den einfachsten Weg. Ich habe einfach zu einer Weiterleitungs-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.

Liebesgramm

Gramrock
quelle
1

Wenn Sie verwenden session_set_cookie_params(), möchten Sie möglicherweise überprüfen, ob Sie den vierten Parameter $secureals übergeben true. Wenn ja, müssen Sie über https auf die URL zugreifen.

Der $secureParameter 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 $secureParameter auf setzen FALSEund 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 DocumentRootin dem httpd-ssl.confvon dem Server , so dass Ihre lokale URL https serviert wird .

Andy Huggins
quelle
1

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

Jayaprakash
quelle
1

Wenn Sie Laravel verwenden und dieses Problem auftritt, müssen Sie Ihre Sitzungsdaten vor der Umleitung speichern.

session()->save();
// Redirect the user to the authorization URL.
header('Location: ' . $authorizationUrl);
exit;
Aubrey Kodar
quelle
0

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

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.

Staplerfluss
quelle
0

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.

Björn Tantau
quelle
0

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

iperich
quelle
Diese Antwort hat bei mir funktioniert. Wir führen ein Amazon Machine Image mit Nginx aus. Es scheint ein Fehler zu sein, dass der Sitzungsordner nicht dem richtigen Benutzer gehört (in unserem Fall www). Durch die Ausführung chown -R www.wwwdes Sitzungsordners wird das Problem behoben.
Joshua
0

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.

almisoft
quelle
0

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.

RewriteEngine on
RewriteCond %{HTTP_HOST} ^yoursitename.com$
RewriteRule ^.*$ "http\:\/\/www\.yoursitename\.com" [R=301,L]
Vishal Kumar
quelle
0

Wenn Sie Wordpress verwenden, musste ich diesen Hook hinzufügen und die Sitzung auf init starten:

function register_my_session() {
    if (!session_id()) {
        session_start();
    }
}
add_action('init', 'register_my_session');
Jack
quelle
0

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.

Julius S.
quelle
0

Stellen Sie zunächst sicher, dass Sie aufrufen, session_start()bevor Sie eine $_SESSIONVariable verwenden.

Wenn Sie die Fehlerberichterstattung deaktiviert haben, versuchen Sie, sie einzuschalten und das Ergebnis anzuzeigen.

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. Speicherplatzproblem. Stellen Sie sicher, dass Ihr Speicherplatz nicht voll ist. Sie benötigen Speicherplatz zum Speichern von Sitzungsdateien.

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

F0G
quelle
0

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_pathParameter in der php.iniDatei nicht korrekt eingerichtet hat .

Wenn jemand dies liest, überprüfen Sie bitte die php.iniKonfiguration vor allem anderen.

Yova dreht sich um
quelle
0

Stellen Sie sicher session_write_close, dass zwischen session_start()und beim Festlegen Ihrer Sitzung kein Aufruf erfolgt .

session_start();

[...]

session_write_close();

[...]

$_SESSION['name']='Bob'; //<-- won't save
Jordan Daigle
quelle
0

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

Dodov
quelle
0

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

Miapuffia
quelle
0

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

Franzisk
quelle
0

Heute hatte ich dieses Problem in einem Projekt und musste diesen Parameter in false ändern (oder die Zeilen entfernen, standardmäßig ist 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

Oscar
quelle
0
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();

Zu spät, um zu antworten, aber das hat bei mir funktioniert

Vipertecpro
quelle
0

Für mich war dies ein Berechtigungsfehler, der ihn behoben hat:

chown -R nginx: nginx / var / opt / remi / php73 / lib / php / session

Ich habe einige 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 ein Serverproblem sein, und tatsächlich war es das auch.

Hoffe das hilft jemandem.

temo
quelle
1
Das Chown ist eine schlechte Lösung, da es beim Paketupdate wieder auf den Standardwert zurückgesetzt wird. Siehe Kommentare in der Standardpoolkonfiguration (www.conf). Richtiger Weg, wenn Sie ein anderes Verzeichnis als das Apache-Verzeichnis verwenden (z. B. / var / lib / php / nginx / session)
Remi Collet
Du hast recht. Paket-Update war der Grund für mein Problem in erster Linie. Aber da dies so gemacht wurde und ich eine schnelle Lösung brauchte, half dies. Mein SYS-Administrator hat das Problem behoben. Ich bin mit Linux nicht annähernd gut.
Temo