2010-09-05 196 views
8

我有一個需要登錄的網頁。一旦用戶登錄,我開始會話,一旦他註銷,我就銷燬它,但是當我按下後臺頁面時,它又給了我用戶配置文件頁面,理想情況下不應該是用戶註銷的情況。但是,如果我在註銷後重新加載頁面,它工作正常。重新加載按鈕上的頁面

這是一個本地聊天室,在線聊天室和在線人都可以一起聊天。共有三頁:login.php,auth.php,logout.php

login.php是包含表單的常用登錄頁面。 auth.php有一個div直到現在顯示所有以前的聊天記錄,一個文本框和共享按鈕,點擊哪個表單再次發送到auth.php,因此每次發佈表單時,聊天信息都會發送到數據庫,並且auth會重新加載最新的數據庫聊天分區..

現在問題是我註銷後,我取消所有變量並銷燬會話,但即使如此,如果我點擊瀏覽器(Safari)後退按鈕,auth.php的前一個版本沒有上次聊天記錄是可見的,理想情況下不應該像會話被破壞一樣。我已經把會話驗證在auth.php,所以基本上我想auth.php重新加載它註銷的重裝auth.php顯示該

「你是不是在登錄」後,我曾嘗試

<?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> 
用戶訪問

很抱歉,我很需要幫助。

+0

提示:用正確的語法來解釋你的問題,而不是1個長句;它會更好的機會,有人會實際上_want_閱讀此。 – Alec 2010-09-05 09:37:47

+1

@Alec,他的語法是正確的,除了輸入錯誤「我想auth.php重新加載''用戶在註銷後訪問它」@ tushar將你的問題分成段落以提高可讀性 – 2010-09-05 09:40:55

+0

這很奇怪你使用PHP'session_start()'函數在登錄頁面生成會話?如果是的話,它應該已經注意發送正確的標題,以防止瀏覽器從緩存頁面(請參閱我的答案)。你在測試什麼瀏覽器? – 2011-05-22 16:14:09

回答

6

這些頭將迫使瀏覽器,如果任何代理,不要緩存頁面,迫使新的請求到服務器該頁面:

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

這樣做也會破壞所有會話變量 – tushar 2010-09-05 09:42:40

+0

,因爲當我開始會話時,現在當我重新加載頁面後輸入上面的代碼時,我的$ _session ['logged'] = 1 – tushar 2010-09-05 09:43:29

+2

它的值爲空 – tushar 2010-09-05 09:44:26

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 

這對我的作品在FF3。 6,IE7,IE8,Chrome5(擊中瀏覽器的後退的時候/來回按鈕的頁面總是重裝上陣

另一種解決方案是發送正是通過session_start()功能,非常類似於上面的那些發送相同的頭文件,但更豐富:

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"); 

注:也在這裏顯示的順序是一樣的session_start()(您可以測試此與HttpFox插件的FF)

0

發送不改變順序url,把它放在head標籤中。
該腳本使用兩個cookie:
- 一個存放如果頁面已被訪問
- 一個存放如果reaload已被觸發

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

對於純JavaScript的解決方案只是添加到您的HTML :

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

該代碼只是簡單地向隱藏的輸入賦值,該隱藏的輸入將在點擊後退按鈕後保留。然後這用於確定頁面是否過時,以及在何種情況下重新加載頁面。

+0

這在微信中有效 – xiongjiabin 2015-10-26 03:39:06

0

我使用的是混合解決方案,因爲我沒有找到一個跨瀏覽器方法來重新加載頁面後點擊後退按鈕。

首先,我有些meta標籤添加到所有我的網頁:

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

其次,我添加了標籤上的以下JavaScript在我所有的網頁:

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

我申請此修復程序在我的其中一個網站,它在IE 10,Safari和Chrome中運行良好。

0

我已經嘗試了很多解決方案,但對我而言,這是簡單的代碼行。

<body onunload=""> 

使用body標籤添加卸載事件並檢查您的問題。

相關問題