2010-09-05 3 views
8

Ho una pagina Web che richiede il login. Una volta che un utente ha effettuato l'accesso, avvio la sessione e una volta che si disconnette, la distruggo, ma quando premo la pagina posteriore mi restituisce la pagina del profilo utente che idealmente non dovrebbe essere il caso in cui l'utente si è disconnesso. Tuttavia, funziona correttamente se ricarico la pagina dopo aver effettuato il logout.Ricarica la pagina premendo il pulsante Indietro

È una chat room locale in cui tutti gli utenti online e connessi possono chattare insieme. Sono disponibili tre pagine: login.php, auth.php, logout.php

login.php è la pagina di accesso comune che contiene un modulo. auth.php ha uno div che visualizza tutte le chat precedenti fino a ora, un pulsante di testo e condivisione su quale modulo viene inviato nuovamente a auth.php così ogni volta che il modulo viene inviato il chat viene inviato al database e l'autenticazione viene ricaricata con l'ultimo database all'interno il numero di chat

Ora il problema è una volta che ho disconnesso ho annullato tutte le variabili e distruggo la sessione ma anche in quel caso se premo il pulsante Indietro nel browser (Safari), la versione precedente di auth.php senza l'ultima voce di chat è visibile che idealmente non dovrebbe, in quanto la sessione viene distrutta. Ho messo una convalida della sessione in auth.php, in modo sostanzialmente voglio il auth.php per ricaricare le visite degli utenti che dopo aver abbandonato come ricaricare auth.php display che "non sei collegato in"

ho cercato

<?php header("Cache-Control: no-cache"); 
header("Pragma: no-cache"); 
?> 
and 
<head> 
<meta http-equiv='Pragma' content='no-cache'> 
<meta http-equiv='Expires' content='-1'> 
</head> 

Ci scusiamo per la lunga domanda, ma ho davvero bisogno di aiuto su questo.

+0

Suggerimento: utilizzare la corretta grammatica per spiegare il problema, anziché 1 lunga frase; migliorerà le probabilità che qualcuno vorrà davvero _want_ leggerlo. – Alec

+1

@Alec, la sua grammatica è corretta tranne un errore di battitura "voglio che l'auth.php si ricarichi' di "l'utente lo visita dopo il logout". @ Tushar rompi la tua domanda in paragrafi per migliorare la leggibilità –

+0

questo è molto strano utilizzare la funzione PHP 'session_start()' per generare la sessione nella pagina di accesso? Se sì, dovrebbe già fare attenzione a inviare l'intestazione corretta al fine di impedire al browser di nascondere la pagina (vedi la mia risposta). Su quale browser hai provato questo? –

risposta

6

Questi header saranno forzare il browser e proxy se del caso, di non memorizzare nella cache la pagina e forzare una nuova richiesta al server per quella pagina:

header("Cache-Control: private, must-revalidate, max-age=0"); 
    header("Pragma: no-cache"); 
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // A date in the past 
+0

fa anche questo distrugge tutte le variabili di sessione – tushar

+0

perché quando inizio la sessione faccio $ _session ['loggato'] = 1 – tushar

+2

ora quando ho inserito il codice sopra dopo aver ricaricato la pagina il suo valore è nullo – tushar

8
header("Expires: Thu, 19 Nov 1981 08:52:00 GMT"); //Date in the past 
header("Cache-Control: no-store, no-cache, must-revalidate"); //HTTP/1.1 

Questo funziona per me su FF3. 6, IE7, IE8, Chrome5 (quando colpisce il pulsante/indietro indietro del browser la pagina è sempre ricaricata)

Un'altra soluzione è quella di inviare esattamente le stesse intestazioni inviate da session_start() funzione, molto simili a quelli di cui sopra, ma ancora più ricco:

header("Expires: Thu, 19 Nov 1981 08:52:00 GMT"); //Date in the past 
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); //HTTP/1.1 
header("Pragma: no-cache"); 

NOTA: anche l'ordine mostrata qui è lo stesso che l'ordine inviato dal session_start() (è possibile verificare questo con HttpFox addon per FF)

0

Senza cambiare la url, metti questo nel tag head.
Lo script utilizza due cookie:
- uno per memorizzare se la pagina è stata visitata
- uno per memorizzare se il reaload è stato attivato

if(navigator.cookieEnabled){  
    var visited=0; 
    var refreshing=0; 
    if(Get_Cookie('visited')) { 
     visited=parseInt(Get_Cookie('visited')); 
    } 
    if (Get_Cookie('refreshing')) { 
     refreshing=parseInt(Get_Cookie('refreshing')); 
    } 
    if(visited==1){ 
     if(refreshing==0){ 
      window.document.cookie = 'refreshing=1'; 
      window.location.reload(); 
     }else{ 
      window.document.cookie = 'refreshing=0'; 
     } 
    }else{ 
     window.document.cookie = 'visited=1'; 
    } 
} 
4

Per una soluzione javascript pura basta aggiungere questo al vostro HTML :

<input id="alwaysFetch" type="hidden" /> 
<script> 
    setTimeout(function() { 
     var el = document.getElementById('alwaysFetch'); 
     el.value = el.value ? location.reload() : true; 
    }, 0); 
</script> 

il codice assegna semplicemente un valore per l'input nascosto che rimarrà dopo il pulsante indietro viene cliccato. Questo viene quindi utilizzato per determinare se la pagina è scaduta, nel qual caso viene ricaricata.

+0

funziona in wechat – xiongjiabin

0

Sto utilizzando una soluzione mista, poiché non ho trovato un metodo cross-browser per ricaricare la pagina dopo aver premuto il pulsante Indietro.

In primo luogo, aggiungo alcuni meta tag per tutte le mie pagine:

<meta http-equiv="Pragma" content="no-cache"> 
<meta http-equiv="no-cache"> 
<meta http-equiv="Expires" content="-1"> 
<meta http-equiv="Cache-Control" content="no-cache"> 

In secondo luogo, aggiungo il seguente javascript sul tag in tutte le mie pagine:

<script type="text/javascript">  
// If persisted then it is in the page cache, force a reload of the page. 
     window.onpageshow =function(event){ 
      if(event.persisted){   
       document.body.style.display ="none";   
       location.reload(); 
      } 
     }; 
</script> 

Mi candido questa correzione in uno dei miei siti Web e funziona perfettamente in IE 10, Safari e Chrome.

0

Ho provato molte soluzioni ma quello che ha funzionato per me è questa semplice linea di codice.

<body onunload=""> 

Aggiungi evento di scarico con tag del corpo e verifica il problema.