PHP Logout无法在线工作

时间:2013-07-16 22:01:08

标签: php sql session logout

我试图在互联网和堆栈溢出上查看我的问题,但没有找到解决我的问题的答案。所以我为一个我正在为开源项目创建的网站有一个后端系统。我现在刚刚完成了将所有内容转移到我的在线域名和数据库。在解决了很多其他问题后,除了注销外,它现在可以正常工作。

在我的后端标题中,我有以下网址

<a href="logout.php"><h1>Logout</h1></a>

logout.php页面的内容如下:

<?php
session_regenerate_id();
session_start();
session_unset();
$_SESSION = array();
session_destroy();

header("Location: login.php");
?>

离线,通过MAMP这没有任何问题。但是在线它不会破坏我的会话。我仍然可以访问我的所有会话变量,这使我能够保持登录状态。正如我之前所说,我试图寻找答案,但我似乎找不到解决问题的方法。如果有人知道可能有什么问题,请告诉我。提前谢谢!

修改 这是我检查每个后端页面的方式,无论我是否登录:

function sec_session_start() {
    $session_name = 'sec_session_id'; // Set a custom session name
    $secure = false; // Set to true if using https.
    $httponly = true; // This stops javascript being able to access the session id. 

    ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies. 
    $cookieParams = session_get_cookie_params(); // Gets current cookies params.
    session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly); 
    session_name($session_name); // Sets the session name to the one set above.
    session_regenerate_id(true); // regenerated the session, delete the old one.   
    session_start(); // Start the php session
}

如您所见, @paprprogrammer ,我会使用Cookie做点什么。当我退出时,如何销毁它?

修改(2):

好的,谢谢paulprogrammer指针。我从登录检查功能中删除了cookie部分,并将其转换为以下简单函数:

function sec_session_start() {
session_start();
}

这不会创建cookie,现在它确实有效。我试图通过官方php manul说@ http://php.net/manual/en/function.session-destroy.php的东西取消设置cookie,但是没有这样做。所以这就是为什么我转向更简单的工作原因。因为除了我之外没有多少人会使用后端,因为它似乎工作正常,即使没有cookie,我也称之为完成。可以关闭此主题:)

最终修改(3): 好的,感谢* @paulprogrammer ,它现在也可以使用cookies。既然我知道了答案,那么你必须这样做才符合逻辑。愚蠢的我。好吧,显然我必须设置会话的名称,就像我在会话中所做的那样。我在开始之前就开始这样做了。新的,更新的登录检查功能代码:

<?php
session_name('sec_session_id');
session_start();
setcookie(session_name(), '', 100);
session_unset();
session_destroy();
$_SESSION = array();

header("Location: login.php");
?>

1 个答案:

答案 0 :(得分:0)

您在设置代码中设置了会话名称,但未能在拆解代码中设置它。因此,在拆解过程中,PHP会破坏默认会话名称,而不是您的自定义会话名称。注销后,请求仍然可以使用自定义会话名称。

只需在使用会话操作的任何地方始终使用session_name()功能,以确保会话管理始终采用正确的会话令牌。

在你的logout.php中:

<?php
session_name('sec_session_id');

session_regenerate_id();
session_start();
session_unset();
$_SESSION = array();
session_destroy();

header("Location: login.php");
?>
相关问题