我遇到浏览器缓存(显然很常见)的问题,我的安全页面可以通过后退按钮访问(用户注销后)。
这是我的logout.php
<?php
// 1. Find the session
session_start();
// 2. Unset all the session variables
$_SESSION = array();
// 3. Destroy the session cookie
if(isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-42000, '/');
}
// 4. Destroy the session
session_destroy();
redirect_to('index.php?logout=1');
?>
这可以成功地在IE7,IE8,Chrome和Firefox上注销用户 - 但在Safari中,我可以按下后退按钮(在注销后立即)并仍然可以看到安全内容。如果我刷新安全页面,它会将我引导至登录屏幕(应该如此。)
我尝试过使用:
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">
......但它没有效果。有人可以提供任何建议吗?我在浏览器缓存中找到了this article,但我还没有在其中找到答案......虽然我找到了:
<?php
Header("Cache-Control: must-revalidate");
$offset = 60 * 60 * 24 * 3;
$ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
Header($ExpStr);
?>
......这也无法解决&#34;问题。&#34; HMM。
答案 0 :(得分:3)
如果您可以使用HTTPS,则结合Cache-control: no-cache
标头将禁用“页面缓存”(内存/后向缓存的WebKit术语)。这样做的缺点是它将被禁用所有安全页面视图,而不仅仅是在注销后。 (Source;注意他们正在努力允许例外,值得关注这一点。)
如果您可以依赖JavaScript,附加unload
事件处理程序将阻止“页面缓存”。这样做的好处是,只有在单击“注销”按钮或链接时才允许您仅通过附加unload
事件处理程序来中断缓存。 (Source)
这些解决方案都不是理想的,但其中一个可能是值得妥协的。
答案 1 :(得分:1)
这似乎是一个webkit / Safari问题。之前已经提出过这个问题,但没有明确答案 - Safari Back button not honouring PHP logout session
看看答案中的链接,我想你会在卸载活动中找到答案。
答案 2 :(得分:0)
部分问题是您将来要设置Expires
标头。浏览器使用Expires
标头作为指示某些内容应保留在缓存中的时间。试试这个:
$ offset = 60 * 60 * 24 * 3;
$ ExpStr =“过期:”。 gmdate(“D,d M Y H:i:s”,time() - $ offset)。 “GMT”;
报头($ ExpStr);
这会在过去设置一个过期标头,并强制浏览器每次都重新请求该页面。