【问题标题】:delete cookie in php删除 php 中的 cookie
【发布时间】:2012-02-22 19:32:03
【问题描述】:

我正在尝试删除 cookie。

我正在使用setcookie("PHPSESSID", "", time() - 6400);,它可以很好地删除 cookie。

但它并未完全删除。查看萤火虫时,在“响应标头”下,cookie 被删除。但是在“请求标头”下,cookie 不会被删除(这会影响代码行为)。

我该如何删除(或修改或访问)这个其他 cookie?

谢谢!

【问题讨论】:

  • 你的最终目标是什么? php有session_destroy()
  • 调用setcookie()删除PHPSESSID的页面是否也恰好在顶部调用session_start()?如果是这样,cookie 将在页面重新加载时重置。
  • 它是如何影响代码行为的? cookie 并没有真正删除,而是可以设置为过期。直到客户端过期 cookie 才会生效。您是说您能够访问 cookie 客户端,还是对服务器的后续请求?您是否在删除 cookie 的同一请求中启动会话?
  • @LucyWeatherford 删除请求标头中的 Cookie 没有意义。一旦您的 PHP 运行,请求标头就毫无意义。它们已经发送到您的服务器。
  • 这个问题好像被误解了。我们都已经解释了删除 cookie 的方法。我要么认为 Firebug 是错误的,要么这不能过期/删除。

标签: php cookies session-cookies


【解决方案1】:

我的注销代码遇到了这样的问题,经过努力和研究,我自己终于弄明白了并使用javascript解决了这个问题。

您可以使用下面的脚本轻松地在客户端执行此操作, 您可能需要更改路径和主机的值:

document.cookie = "PHPSESSID=; expires=Thu, 01 Jan 1970 00:00:00   UTC;path=/;host=localhost";

【讨论】:

  • 这也解决了我想使用存储在cookie中的数据,然后在一个页面加载中取消设置cookie的问题。您的 Javascript 解决方案终于解决了我的问题。 (Cookie 一直持续到下一页加载,使页面解析 cookie 两次。)
【解决方案2】:

使用setcookie("PHPSESSID", "", time() - 6400); 会使 cookie 像 2 小时前一样过期, 尝试使用setcookie("PHPSESSID", "", 1); 将其在 1970 年 1 月 1 日到期。

如果这不起作用,您可以尝试在路径中添加setcookie("PHPSESSID","",time()-6400,"/");

您可以尝试http://www.php.net/manual/en/function.setcookie.php#73484 中的这个示例来删除所有 cookie,但我是因为这似乎是某种知道的超级cookie..

// unset cookies
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, '/');
    }
}

【讨论】:

  • 不一样吗?我认为及时设置 cookie 会破坏它,无论时间跨度是多少
  • 这两个选项都不起作用。同样,所发生的只是“响应标头”cookie 被删除,但“请求标头”cookie 没有改变。 :(
【解决方案3】:

您可能还想取消设置 $_COOKIE 变量,方法是添加一个

unset($_COOKIE['PHPSESSID']);

在下一行。然而,这只会影响当前加载的页面。

【讨论】:

  • 我也试过了,没用 - 再次,Response Headers cookie 正在被删除,但 Request Headers cookie 没有
  • 这只会改变全局变量 $_COOKIE['PHPSESSID'],而不是实际的 cookie。
【解决方案4】:

这段代码可以解决这个问题:

session_start(); // initialize session
session_destroy(); // destroy session
setcookie("PHPSESSID","",time()-3600,"/"); // delete session cookie

【讨论】:

    【解决方案5】:

    请参阅此处的示例 1 以删除和销毁会话:

    http://php.net/manual/en/function.session-destroy.php

    首先取消设置 cookie,然后销毁会话。

    【讨论】:

    • 不。这不起作用,“请求标头”cookie 仍然没有改变
    • @Lucy Weatherford “请求标头”cookie 的到期时间是多少?要删除 cookie,您必须通过请求标头将相同名称的 cookie 从服务器发送到过期日期的浏览器。重要的是,你能访问这个 cookie 客户端吗?客户端会在下一个请求中继续发送这个 cookie 吗?如果答案是否定的,那么您的 cookie 将被删除。
    • 如果您按照上面的说明进行操作,但仍有问题,那么您的问题出在其他地方。您很可能在删除过程之后开始了一个新会话,或者您只是误解了 cookie 是如何协同工作的。
    • 是的,我一直在关注它,响应标头 cookie 正在被删除,请求标头 - 不是。 “请求标头”不会在萤火虫中显示它们的到期时间。 - 这是我可以在客户端访问这个 cookie 的地方(那么对你的另一个问题是肯定的)。 NEXT 请求中发生的事情对我来说并不重要 - 我需要在此处将其删除。如何在此页面上更改它。我知道这是可能的,因为我尝试在隐身模式下查看页面,并且在那里一切正常,只有当它不是隐身时,才不会删除请求标头 cookie。
    • @LucyWeatherford 所以你说在 PHP 清除并过期 cookie、销毁会话并将其输出发送到客户端之后,客户端仍然能够通过 javascript 读取 cookie?听起来好像您可能会在销毁旧会话后在代码中的某个位置开始新会话,这反过来又会创建一个新的会话 id cookie。删除会话cookie并销毁会话后,cookie的值是否会更改为新的会话ID?
    猜你喜欢
    • 2018-01-21
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多