如何在PHP注销后不允许用户返回?

时间:2009-06-23 22:14:44

标签: php

我刚刚编写了一个PHP登录脚本,我想要完成的是当用户点击退出链接时,在他们注销后,无论点击浏览器的后退按钮,他们都无法访问该页面。

这是退出功能:

//Start the Session
session_start();
session_destroy();

header("location:login.php");
exit();

我确实在所有页面上放置了以下代码,这似乎没有完成任务:

header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Date in the past
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");  // HTTP/1.1
header ("Pragma: no-cache");

//Start the Session
session_start();

有什么建议吗?

8 个答案:

答案 0 :(得分:8)

您无法控制服务器上客户端后退按钮的工作方式。您可以使用客户端上的javascript销毁历史数据。

客户端可以完全忽略no-cache标头。

答案 1 :(得分:2)

如果没有登录$ _SESSION,只需重定向,例如:

//on your protected pages
session_start();
if(!$_SESSION['logged']) {
    header("location:login.php");
}

这是我的退出操作:

session_start();
// Unset all of the session variables.
$_SESSION = array();
// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time()-42000, '/');
}
// Finally, destroy the session.
session_destroy();

答案 2 :(得分:2)

如果仍然使用正确的值设置会话全局,请检查用户何时注销。

print_r($_SESSION);

这样做的原因是你正在做一个session_destroy,然后是一个头重定向,结果就是你强制重定向,并且会话的破坏不是那样写到服务器上的。

答案 3 :(得分:2)

我认为您需要在会话中存储内容,然后在每个页面加载时检查它。以下是我过去的做法

登录脚本(简化)

session_start()
// register necessary session variables
$_SESSION['username'] = $username;

退出脚本:

session_start();

// destroy the session and check to make sure it has been destroyed
session_destroy();
    if(!session_is_registered('username')){
        $loginMessage = 'You have been logged out.';
        include 'index.php';
        exit();
    }

// if we're still here, some bad juju happened

每页顶部

session_start()

// make sure user is logged in
if (!$_SESSION['username']) {
    $loginError = "You are not logged in.";
    include("index.php");
    exit();
}

答案 4 :(得分:0)

我建议你使用HTTPS和SSL。您可以关闭SSL会话并将用户踢回非加密页面。

大多数浏览器以不同方式实现缓存方案。

例如,在Opera中,您可以单击“返回”,它将直接从内存中提取页面数据,而不会向服务器发送任何数据,即使页面已过期也是如此。如果点击“刷新”,当然,您的服务器需要登录。

在Internet Explorer中,处理方式非常不同,表单数据会重新提交给服务器。

答案 5 :(得分:0)

可能是您的 session_destroy()函数。试试这个:

unset($_SESSION);

取消设置 $ _ SESSION 变量将清除此处存储的所有内容。

查看unset() on PHP.net

答案 6 :(得分:0)

$_SESSION['blah'] = '';

这也有效..

答案 7 :(得分:0)

<?
session_start();
if (!isset($_SESSION['username']) && !isset($_SESSION['password'])) {
    header('Location:../index.php');
    exit;
} else {
    session_destroy();
}
?>

这确实对我有帮助..将其粘贴到每个页面或您注销

的页面中
<?php
session_start();
session_unset();
session_destroy();
header("Location:../index.php");
exit;

就像破坏你的会话一样简单