【问题标题】:PHP: delete cookie before redirect fails [duplicate]PHP:在重定向失败之前删除 cookie [重复]
【发布时间】:2013-03-29 11:41:48
【问题描述】:

有很多关于这个问题的帖子,但我无法解决它。我尝试删除 cookie 以便在 PHP 中注销用户并在之后进行重定向:

    $currentCookieParams = session_get_cookie_params(); 
    session_set_cookie_params($currentCookieParams['lifetime'], '/', $currentCookieParams['domain'], $currentCookieParams['secure'], true);
    session_name("PHPAUTH");
    session_start();

    $_SESSION = array();

    if (ini_get("session.use_cookies"))
    {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
    }
    session_destroy();          

    header("Location: http://localhost/Home/Index");
    exit;

但是 cookie 仍然存在。当我禁用重定向时,cookie 被成功删除。但是通过重定向,cookie 无论如何都不会被删除。

如何确保 cookie 在之后通过重定向删除?

编辑:

似乎我自己的代码在下一个请求中重新创建了 cookie。我想检查用户是否仍然登录,如果没有重定向到登录页面:

        $currentCookieParams = session_get_cookie_params(); 
        session_set_cookie_params($currentCookieParams['lifetime'], '/', $currentCookieParams['domain'], $currentCookieParams['secure'], true);
        session_name("PHPAUTH");
        session_start();     

        if (!array_key_exists('angemeldet', $_SESSION) || !$_SESSION['angemeldet'])
        {
            header("Location: http://localhost/Account/LogOn");
            exit;
        }

如何在不重新创建 cookie 的情况下进行检查?也许是一个愚蠢的问题,但我现在很困惑......

【问题讨论】:

  • 很可能在下一个请求中再次设置会话cookie?
  • 位于(我猜是 index.php)localhost/Home/Index 的文件是什么样的?
  • localhost/Home/Index 不仅是一个文件,它还是 MVC 引擎的一部分。控制器 Home 的 action Index 的视图呈现在 Layout 页面中。但是我用正常的url测试了一下,问题还是出现了。
  • @Gerry:天哪,我忽略了显而易见的事情......看来你是完全正确的。谢谢你,我会更新我的问题。
  • 我真的不明白您为什么要操纵会话 cookie 来检查用户是否已登录?只需设置并检查一个会话变量,例如 $_SESSION['is_authenticated'] ?

标签: php session redirect cookies


【解决方案1】:

我认为header() 函数必须高于任何其他类型的函数。如果我是对的并且您仍然想要这样的编程格式,您可以尝试此代码是否有效:

if (ini_get("session.use_cookies"))
{
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
}
session_destroy();          

echo '<meta http-equiv="REFRESH" content="0;url=http://localhost/Home/Index">';
exit;

当然,前提是您愿意这样做。我只是给你一个例子,我不确定将&lt;meta http-equiv="REFRESH" content="0;url=http://localhost/Home/Index"&gt; 与你的语法结合起来是否可行。

【讨论】:

  • 只有在关闭Output Buffering 时,您的假设才成立。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 2018-10-21
相关资源
最近更新 更多