PHP - 为啥我不能摆脱这个会话 id cookie?

Posted

技术标签:

【中文标题】PHP - 为啥我不能摆脱这个会话 id cookie?【英文标题】:PHP - why can't I get rid of this session id cookie?PHP - 为什么我不能摆脱这个会话 id cookie? 【发布时间】:2011-04-28 17:01:18 【问题描述】:

我正在尝试对 Web 应用的注销功能进行故障排除。当您登录时,该应用程序为其域设置了多个 cookie。这是当前的注销过程:

您单击一个链接,该链接会将您转到注销页面 注销页面运行一个调用 session_destroy() 的函数,并循环访问该域的所有 cookie 并将它们设置为在过去过期(参见下面的代码) 然后注销页面重定向到登录页面,该页面是纯 html

在此过程结束时,所有其他 cookie 都未设置,但 phpSESSID cookie 仍然存在,具有相同的值,并且仍然设置为在会话结束时过期。

我错过了什么?

这是我上面提到的注销功能:

function log_out_current_user() 

        // Destroy the session
        if (isset($_SESSION)) 
            session_destroy();
        

        // Expire all of the user's cookies for this domain:
        // give them a blank value and set them to expire
        // in the past
        if (isset($_SERVER['HTTP_COOKIE'])) 
            $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
            foreach($cookies as $cookie) 
                $parts = explode('=', $cookie);
                $name = trim($parts[0]);
                setcookie($name, '', time()-1000);
                setcookie($name, '', time()-1000, '/');
            
            // Explicitly unset this cookie - shouldn't be redundant,
            // but it doesn't hurt to try
            setcookie('PHPSESSID', '', time()-1000);
        

    

【问题讨论】:

【参考方案1】:

您不会使用与创建它相同的参数来删除它。使用session_get_cookie_params 获取这些。为了便于携带,您应该通过session_name 获取cookie 的名称。这是一个执行此操作的小脚本:

$params = session_get_cookie_params();
setcookie(session_name(), '', 0, $params['path'], $params['domain'], $params['secure'], isset($params['httponly']));

【讨论】:

这是我在这个主题中发现的最有用的东西。事实证明我在路径中缺少一个字符。这可以处理所有工作并防止您犯错误。谢谢!

以上是关于PHP - 为啥我不能摆脱这个会话 id cookie?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 PHP 会话会死掉?为啥我不能恢复它们?

为啥我的标题中有两个会话 ID?

为啥我的 url 中有会话 ID?

为啥不使用长寿命会话 ID 来代替带有令牌的持久 cookie?

我怎样才能摆脱 CodeMirror div ?为啥我有它?

php会话随机丢失,无法理解为啥