我有这个文件
secure.php
session_start();
if(empty($_SESSION['u_name'])) {
header("Location:emprego.php");
}
if(isset($_GET['logout'])) {
session_destroy();
header("Location:emprego.php");
}
$name = $_SESSION['u_name'];
?>
<li><?php echo "<a href='emprego.php?logout' id='D'>Logout</a>";?></li>
基本上,如果我注销,我将被重定向到emprego.php。但如果我点击后页按钮(浏览器中的箭头),我可以查看同一页面(secure.php)。
我的问题是,为什么?
感谢
答案 0 :(得分:2)
http://nl2.php.net/manual/en/function.session-destroy.php
在这里看一下示例1。它明确指出你必须清除$ _SESSION。
if(isset($_GET['logout'])) {
unset($_SESSION['u_name']); //makes it non-existent (it does unset) that variable
session_destroy();
header("Location:emprego.php");
}
答案 1 :(得分:0)
您的浏览器会在缓存中保留该页面的副本。单击后退按钮时,您将看到本地缓存副本,而不是服务器中的当前页面。如果您的安全性设置正确,您将无法从该缓存页面执行任何有意义的操作。
出于这个原因,安全网站(例如银行网站)会在您退出后告诉您注销并清除缓存(或关闭浏览器)。
答案 2 :(得分:0)
如果您正在使用会话cookie,请尝试明确地过期会话cookie,如下所示:
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
此外,返回浏览器只会加载页面的缓存副本。如果您尝试与缓存页面进行交互以从服务器获取新页面,则应该无法继续。
答案 3 :(得分:0)
我最近找到了header_remove();
http://php.net/manual/en/function.header-remove.php
Caution: This function will remove all headers set by PHP, including cookies, session and the X-Powered-By headers.
不确定这是否是适当的方法,但它对退出功能非常有效。
答案 4 :(得分:0)
所有其他解决方案似乎都不适合我。但是,此解决方法可以解决问题。基本上,下面的代码会继续调用注销,直到注销成功为止:
if (isset($_GET["logout"])){
if (isset($_SESSION["username"])) {
unset($_SESSION["username"]);
session_destroy();
header("Location:/?logout=true");
exit;
}
header("Location:/");
exit;
}