2010-09-05 179 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标签添加卸载事件并检查您的问题。

相关问题