我试图在互联网和堆栈溢出上查找我的问题,但没有找到解决我问题的答案。所以我为一个开源项目创建了一个网站的后端系统。我现在刚刚完成将所有内容转移到我的在线域和数据库。在解决了许多其他问题之后,它现在可以工作了,除了注销。
在我的后端头中,我有以下url:
<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
}
正如您所看到的,@paulprogram,我用cookie做了一些事情。如何在注销时确定销毁它
编辑(2):
好的,谢谢paulprogrammer的指针。我从登录检查功能中删除了cookie部分,并将其转换为以下简单功能:
function sec_session_start() {
session_start();
}
这不会创建cookie,现在它确实起作用了。我试图通过php官方手册上说的内容取消设置cookie。@http://php.net/manual/en/function.session-destroy.php但这并没有起到作用。所以这就是为什么我转向了更简单有效的方法。除了我之外,没有多少人会使用后端,而且即使没有cookie,它似乎也能正常工作,我称之为完成。此主题可以关闭:)
最终编辑(3):好的,感谢*@paulsprogrammer,它现在也适用于cookie。既然我知道了答案,你必须这么做似乎是合乎逻辑的。我太笨了。好吧,很明显我必须设置会话的名称,就像我在会话中所做的那样。我在开始之前就这样做了。新的、更新的登录检查功能代码:
<?php
session_name('sec_session_id');
session_start();
setcookie(session_name(), '', 100);
session_unset();
session_destroy();
$_SESSION = array();
header("Location: login.php");
?>
您在设置代码中设置了会话名称,但在拆卸代码中设置失败。因此,在拆卸过程中,PHP破坏了默认会话名称,而不是您的自定义会话名称。注销后,自定义会话名称在请求中仍然可用。
只需在使用会话操作的任何地方一致使用session_name()
函数,即可确保会话管理始终作用于正确的会话令牌。
在您的登录中.php:
<?php
session_name('sec_session_id');
session_regenerate_id();
session_start();
session_unset();
$_SESSION = array();
session_destroy();
header("Location: login.php");
?>