| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

05-01-2011, 13:20
|
|
mcmurphy
PHP Junior
|
|
Registriert seit: Aug 2003
Ort: Berlin
Beiträge: 888
|
|
SESSION Problem mit Safari / Opera
hi,
ich habe folgendes Problem:
ich will mir ein auf einer Seite ein User Login - Logout bauen.
Frage in ner DB den User ab - kann er sich identifizieren wird die SESSION Variable logged auf true gesetzt.
Beim Ausloggen dann entsprechend auf false.
Habe eine index.php mit langer switch abfrage - je nach case wird dann der content angezeigt.
Klappt soweit auch - aber bei Opera und Safari habe ich denn effekt das ich nach dem auslogen geschützte Bereiche zwar nicht direkt an anwählten kann da $_SESSION['logged'] richtig abgefragt wird, beim navigieren mit dem Backbutton aber schon.
Lasse ich mir $_SESSION['logged'] ausgeben wird beim navigieren mit dem Backbutton nach einem Ausloggen im FF und IE korrekt $_SESSION['logged'] = false angezeigt, bei Safari & Opera aber true.
Mal einen Auzug aus dem Code:
PHP-Code:
session_start();
if(!isset($_SESSION['logged'])){
$_SESSION['logged'] = false;
}
if(!isset($_GET['action'])) {
include("x_inc/start.php");
}else if(!$_SESSION['logged']){
switch($_GET['action']){
case "login":
if(login()){// Datenbank Abfrage fürs einloggen
$_SESSION['logged'] = true;
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."?action=secure", true, 302);
}else{
$message = "Fehler beim einloggen";
include("x_inc/error.php");
}
break;
case "confirmReg":// Anmeldung
if(confirmReg()){// wenn user sich registrieren konnte
$_SESSION['logged'] = true;
$message .= "<p>bist drine</p>";
include("x_inc/secure.php");
}else{
$message = "Fehler beim Registrieren";
include("x_inc/error.php");
}
break;
default: include("x_inc/default.php");
}
}else if($_SESSION['logged']){
switch($_GET['action']){
case "secure":
$message .= "<p>logged in</p>";
include("x_inc/secure.php");
break;
case "logout":
$_SESSION['logged'] = false;
$_SESSION = array();
session_destroy();
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."?action=loggedOut", true, 302);
break;
default: include("x_inc/default.php");
}// switch cascade
}
Wie zerstöre ich die SESSION so das es auch Opera / Safari mitbekommen?
Schon THX in Advance....
__________________
"I don't want to belong to any club that would accept me as a member."
Groucho Marx
|

05-01-2011, 13:30
|
|
Skaschy
Registrierter Benutzer
|
|
Registriert seit: Jun 2002
Ort: Bad Wörishofen (Allgäu)
Beiträge: 582
|
|
PHP-Code:
$_SESSION['logged'] = false;
$_SESSION = array();
Macht schonmal keinen Sinn, da nach dem
PHP-Code:
$_SESSION = array();
PHP-Code:
$_SESSION['logged']
gar nicht mehr verfügbar ist (undefined)
__________________
Gruss TobY
|

05-01-2011, 13:49
|
|
mcmurphy
PHP Junior
|
|
Registriert seit: Aug 2003
Ort: Berlin
Beiträge: 888
|
|
Hi Skaschy,
hast natürlich recht, hatte $_SESSION['logged'] = false; auch nur mal reingeschrieben um sicherzugehen das beim ausloggen $_SESSION['logged'] wirklich false ist....
Meine Frage bleibt aber: warum zeigen Safari/Opera beim navigieren mit dem Backbutton falsche werte an?
__________________
"I don't want to belong to any club that would accept me as a member."
Groucho Marx
|

05-01-2011, 14:24
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Ich habe mir deinen Code nicht angesehen, aber entweder wird das Session-Cookie in den betreffenden Browsern nicht gelöscht oder die laden die Seiten nicht vom Server sondern aus ihrem Cache. Beides lässt sich recht einfach überprüfen.
|

05-01-2011, 14:28
|
|
mcmurphy
PHP Junior
|
|
Registriert seit: Aug 2003
Ort: Berlin
Beiträge: 888
|
|
Hi OneMoreNerd,
lasse mir die Session Werte ausgeben - im FF werden sie gelöscht, im Safari nicht.
Beseitige die Session beim ausloggen mit:
$_SESSION = array();// $_SESSION leeren
session_destroy();// Session zerstören
und den Cache mit:
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
Gibt es für Safari /opera sonst noch was zu beachten?
Ach ja, in SelfHtrml gibt es ein Beispiel http://aktuell.de.selfhtml.org/artikel/php/loginsystem/, da tritt das gleiche Problem auf
__________________
"I don't want to belong to any club that would accept me as a member."
Groucho Marx
|

05-01-2011, 14:54
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Das Caching verbietest du aber nur für die Seite, wo man sich ausloggt. Die früheren Seiten sind evtl. trotzdem gecacht.
|

05-01-2011, 14:56
|
|
mcmurphy
PHP Junior
|
|
Registriert seit: Aug 2003
Ort: Berlin
Beiträge: 888
|
|
es wird aber nur die index.php aufgerufen
da gibt es eine switch cascade - je nach case include ich mir dann den content
__________________
"I don't want to belong to any club that would accept me as a member."
Groucho Marx
|

05-01-2011, 14:59
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Ja und nur im Logout-Case verbietest du Caching.
Hast du mal getestet, ob die Seiten beim Zurückblättern wirklich vom Server abgerufen werden?
|

05-01-2011, 15:06
|
|
mcmurphy
PHP Junior
|
|
Registriert seit: Aug 2003
Ort: Berlin
Beiträge: 888
|
|
Hi,
seiten werden aus dem Cache geholt - Backbutton geht auch ohne Verbindung zum Server.
Habe den Cache Block mal ganz nach oben in die index.php gestellt - keine Veränderung
__________________
"I don't want to belong to any club that would accept me as a member."
Groucho Marx
|

05-01-2011, 19:03
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Hast du nach dieser Änderung auch mal deinen Browsercache geleert?
Werden auf allen Seiten die erwarteten Header gesendet?
Wie sieht dein Code aktuell aus?
|

05-01-2011, 19:23
|
|
mcmurphy
PHP Junior
|
|
Registriert seit: Aug 2003
Ort: Berlin
Beiträge: 888
|
|
Erstmal: THX OneMoreNerd für deine Hilfe
Cache habe ich geleert
Hier der Antwort Header von Safaris Entwickler Tool:
PHP-Code:
Cache-Control:max-age=0, post-check=0, pre-check=0
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:894
Content-Type:text/html; charset=UTF-8
Date:Wed, 05 Jan 2011 18:15:34 GMT
Expires:-1
Keep-Alive:timeout=1, max=99
Last-Modified:Wed, 05 Jan 2011 18:15:34 GMT
Pragma:no-cache, no-cache
Server:Apache
Vary:Accept-Encoding
X-Powered-By:PHP/5.2.12-nmm2
meine aktuellen PHP Header ganz oben in meiner index.php:
PHP-Code:
header("Content-type: text/html; charset=UTF-8");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Datum aus Vergangenheit
header("Expires: -1");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT", true); // immer geändert
header("Cache-Control: no-store, no-cache, must-revalidate", true); // HTTP/1.1
header("Cache-Control: max-age=0, post-check=0, pre-check=0", true);
header("Pragma: no-cache", false); // HTTP/1.0
und die meta aus dem Html Bereich:
PHP-Code:
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="pragma" content="no-cache" />
Wie gesagt, ich kann (nach einem LogOut) mit dem Back Button zurück navigieren, wenn ich dann die Seite aktualisiere wird mir richtig angezeigt das ich ausgeloggt bin.
Das gilt für Safari & Opera
__________________
"I don't want to belong to any club that would accept me as a member."
Groucho Marx
|

06-01-2011, 00:33
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Hast du gemerkt, dass es sinnlos ist, den selben Header mehrfach zu setzen?
Hast du getestet, ob die Header das gewünschte bewirken, die Seiten also nicht gecacht werden?
|

06-01-2011, 09:59
|
|
mcmurphy
PHP Junior
|
|
Registriert seit: Aug 2003
Ort: Berlin
Beiträge: 888
|
|
Zitat:
|
Hast du gemerkt, dass es sinnlos ist, den selben Header mehrfach zu setzen?
|
Meinst du z.B.
header("Pragma: no-cache", false); // HTTP/1.0
und
<meta http-equiv="pragma" content="no-cache" />
?
Ich probiere eunfach diverse Tipps aus die im beim Googeln finde.
Laut PHP: header - Manual
Sollte das hier ja ausreichen
PHP-Code:
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Datum in der Vergangenheit
Tut es aber (in Safari / Opera) nicht...
Zitat:
|
Hast du getestet, ob die Header das gewünschte bewirken, die Seiten also nicht gecacht werden?
|
In FF, IE und Chrome funktioniert der test - oder hast du noch eine andere Vorgehens weise zum Testen - Wie kann ich denn mit den Safari Entwickler Tools (oder auch Firebug) sehen ob er sich ne Seite aus dem Cache holt oder vom Server?
BTW:
Hatte auch länger nix mehr mit PHP gemacht und muß mich wieder einfuchsen
__________________
"I don't want to belong to any club that would accept me as a member."
Groucho Marx
|

06-01-2011, 16:05
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Ich meinte eigentlich sowas:
PHP-Code:
header('Expires: ...'); header('Expires: ...');
Es wird nämlich nur der zuletzt gesetzte Header jeden Typs (der Typ ist der String vor dem Doppelpunkt) zum Client geschickt.
Und wenn du die Header mit PHP setzen kannst, brauchst du keine Meta-http-equiv-Tags mehr. Die sind mal irgendwann eingeführt worden, als Webseiten noch statische HTML-Dateien waren. Solche Tags werden vom Browser ignoriert, wenn der selbe Header als echter HTTP-Header empfangen wurde.
Um zu prüfen ob eine Seite aus dem Cache kommt, brauchst du nur einen Zeitstempel z.B. von time() in die Seite zu schreiben. Seite laden, Zeitstempel merken, nächste Seite laden, Sekunde warten, Back-Button klicken und Zeitstempel mit dem gemerkten vergleichen. Bei Gleichheit ist die Seite aus dem Cache gekommen.
|

06-01-2011, 16:46
|
|
mcmurphy
PHP Junior
|
|
Registriert seit: Aug 2003
Ort: Berlin
Beiträge: 888
|
|
THX,
da hatte ich mich mit Headern verlesen:
Zitat:
|
Der optionale Parameter replace gibt an, ob der Header einen vorhergehenden gleichartigen Header ersetzten soll, oder ob ein zweiter Header des selben Typs hinzugefügt werden soll. Standardmäßig wird ersetzt; wenn Sie als zweites Argument FALSE übergeben, können Sie so mehrere Header desselben Typs erzwingen. Zum Beispiel:
|
habe ich jetzt auf false gesetzt
Habe auch mal mit Timestamp geprüft (ich Hirnbär  ):
bei FF und Co. werden die Seiten neu geholt - bei Safari & Opera aus dem Cache geholt
Html - Header habe ich rausgenommen und meine php Header sehen gerade so aus:
PHP-Code:
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT", false); // Datum aus Vergangenheit header("Expires: -1", false); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT", true); // immer geändert header("Cache-Control: no-store, no-cache, must-revalidate", false); // HTTP/1.1 header("Cache-Control: max-age=0, post-check=0, pre-check=0", false); header("Pragma: no-cache", true); // HTTP/1.0
werde nochmal alle Kombinationen mit Safari testen....
THX
__________________
"I don't want to belong to any club that would accept me as a member."
Groucho Marx
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|