【问题标题】:Remove a cookie删除 cookie
【发布时间】:2010-10-15 17:29:58
【问题描述】:

当我想删除 Cookie 时,我会尝试

unset($_COOKIE['hello']);

我在 Firefox 的 cookie 浏览器中看到该 cookie 仍然存在。我怎样才能真正删除 cookie?

【问题讨论】:

  • 您可能会发现来自github.com/delight-im/PHP-Cookie$cookie->delete() 很有帮助。问题中的代码只是删除了已在服务器端解析的属性。 cookie 仍将存在于客户端。

标签: php cookies


【解决方案1】:

我发现在 Chrome 中,除非您在 cookie 中定义最后三个参数,否则无法取消设置 cookie...域,它是安全的并且仅限 http...

if (isset($_COOKIE['user_id'])) {
unset($_COOKIE['user_id']); 
setcookie("user_id", "", time() - 3600, "/", 'yourdomain.com',true,true);
header('Location: /');
} else {
/* other code here */
}

这就是我让它为我工作的方式。 阅读文档:All about cookies in the official PHP Site

【讨论】:

    【解决方案2】:

    你可以试试这个

    if (isset($_COOKIE['remember_user'])) {
        unset($_COOKIE['remember_user']); 
        setcookie('remember_user', null, -1, '/'); 
        return true;
    } else {
        return false;
    }
    

    【讨论】:

    • 我知道这是一个例子,但请永远不要将用户名或密码存储在 cookie 中。
    • unset($_COOKIE['Hello']); 毫无意义。如果您删除它,它不会改变任何内容。
    • @machineaddict unset($_COOKIE['Hello']); 实际上很重要,如果您可以稍后在代码中的某处检查 cookie。
    • 工作正常,但尝试重新加载页面时。它看到用旧数据设置的 cookie 为什么?
    • =======DOES NOT WORK IN CHROME======= 我今天尝试了这段代码,当我使用谷歌浏览器访问该网站时,然后在 Chrome 中进入开发人员工具,我可以看到过期时间设置为纪元前 1 秒(例如 1969-12-31 23:59:59)但是当我下次提交页面时,cookie 被提交到服务器。当我将 -1 更改为 1(例如 1970-01-01 00:00:01)以给出以下命令时: setcookie('Hello', null, 1, '/');然后chrome按预期行事,没有提交cookie
    【解决方案3】:

    只需将 cookie 的值设置为 false 即可取消设置,

    setcookie('cookiename', false);
    

    PS:- 这是最简单的方法。

    【讨论】:

    • 如果定义了declare(strict_types=1);,这将引发致命错误。
    • 这根本不起作用,没有错误,没有警告,没有删除 cookie。
    • 我对 PHP 了解不多,但在我的小项目中:setcookie('key', null); 似乎可以工作。
    【解决方案4】:

    当您输入0 表示时间时,您的意思是浏览器的“现在”(从现在开始的+0 实际上就是现在),它会删除 cookie。

    setcookie("key", NULL, 0, "/");
    

    我在 chrome 浏览器中检查了它,它给了我:

    Name: key
    Content: Deleted
    Created: Sunday, November 18, 2018 at 2:33:14 PM
    Expires: Sunday, November 18, 2018 at 2:33:14 PM
    

    【讨论】:

    • 没有。只需阅读文档。 “如果设置为 0 或省略,cookie 将在会话结束时(浏览器关闭时)过期。”
    • @DrLightman 感谢您的出席,您能引用文档吗?
    • function.setcookie.php, expires 参数。 “如果设置为 0 或省略,cookie 将在会话结束时(浏览器关闭时)过期。”
    【解决方案5】:

    如果您想从您当前的所有域中完全删除 cookie,那么下面的代码肯定会对您有所帮助。

    unset($_COOKIE['hello']);
    setcookie("hello", "", time() - 300,"/");
    

    此代码将从您的所有域中完全删除 cookie 变量,即; “ /” - 它表示cookie变量的值全部设置为所有域,而不仅仅是当前域或路径。 time() - 300 表示它设置为以前的时间,因此它将过期。

    这就是它被完美删除的方式。

    【讨论】:

      【解决方案6】:

      要可靠地删除 cookie,将其设置为在过去的任何时间过期是不够的,这是由您的 PHP 服务器计算的。这是因为客户端计算机的时间可以而且经常确实与您的服务器不同。

      最佳做法是用一个空白 cookie 覆盖当前 cookie,该 cookie 在 epoch(1970 年 1 月 1 日 00:00:00 UTC)之后的一秒 过期,如下所示:

      setcookie("hello", "", 1);
      

      【讨论】:

      • 如果我错了,请纠正我,但是将其设置为“1”会将其设置为纪元之后的一秒,而不是未来的一秒..?我相信您对时区差异的看法是正确的,因此最好的解决方案是将其设置为过去 2 天(因此即使最远的时区仍会取消设置 cookie)。
      • @PaulSkinner 纪元日期与时区无关,计算机会为您进行计算。
      • @AlexR 是的。虽然并没有真正回答我的观点。据我了解,上面的代码确实将cookie设置为在过去(纪元过去一秒)过期,除非我弄错了。
      • @PaulSkinner 当然,您的其余评论都很好。
      • +1 表示“1”。我不明白为什么所有其他人都如此专注于在过去一小时内设置已删除的 cookie。
      【解决方案7】:

      您必须在服务器中使用 php 删除 cookie,还必须在浏览器中使用 js 删除 ..(它们是用 php 制作的,但 cookie 文件也在浏览器客户端中):

      一个例子:

      if ($_GET['action'] == 'exit'){
                  // delete cookies with js and then in server with php:
                  echo '
                  <script type="text/javascript">
                      var delete_cookie = function(name) {
                           document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:01 GMT;";
                      };
                      delete_cookie("madw");
                      delete_cookie("usdw");
                  </script>
                  ';
      unset($_COOKIE['cookie_name']);
      unset($_COOKIE['cookie_time']);
      

      【讨论】:

      【解决方案8】:

      你们中的大多数人都忘记了这只能在本地机器上工作。 在域上,您将需要像此示例这样的模式。

      setcookie("example_cookie", 'password', time()-3600, "/", $_SERVER['SERVER_NAME']);
      

      【讨论】:

      • 域参数如果省略则表示当前域。
      • 我的意思是说你的答案不正确。它适用于任何域,而不仅仅是本地机器,因为它会自动使用当前域。你的评论是说你被冒犯了还是什么?
      • 我不明白,如果其他用户指出您的回答有误,您为什么会对他们感到恼火。 setcookie 适用于任何域,无论是否为 localhost。
      【解决方案9】:

      这就是 PHP v7 setcookie() 代码的工作方式:

      <?php
          setcookie('user_id','');
          setcookie('session','');
      ?>
      

      从 tcpdump 在端口 80 上嗅探时的输出,服务器向客户端(浏览器)发送以下 HTTP 标头:

      Set-Cookie: user_id=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0
      Set-Cookie: session=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0
      

      浏览器在以下请求中观察数据包不再在标头中发送这些 cookie

      【讨论】:

        【解决方案10】:

        很简单!

        setcookie("cookiename", "cookievalue", 1);
        

        【讨论】:

        • 删除cookie不需要设置值!
        【解决方案11】:
        $cookie_name = "my cookie";
        $cookie_value = "my value";
        $cookie_new_value = "my new value";
        
        // Create a cookie,
        setcookie($cookie_name, $cookie_value , time() + (86400 * 30), "/"); //86400 = 24 hours in seconds
        
        // Get value in a cookie,
        $cookie_value = $_COOKIE[$cookie_name];
        
        // Update a cookie,
        setcookie($cookie_name, $cookie_new_value , time() + (86400 * 30), "/");
        
        // Delete a cookie,
        setcookie($cookie_name, '' , time() - 3600, "/"); //  time() - 3600 means, set the cookie expiration date to the past hour.
        

        【讨论】:

          【解决方案12】:

          删除 cookie 的一种干净方法是清除 $_COOKIE 值和浏览器 cookie 文件:

          if (isset($_COOKIE['key'])) {
              unset($_COOKIE['key']);
              setcookie('key', '', time() - 3600, '/'); // empty value and old timestamp
          }
          

          【讨论】:

          • 这是最好的方法,因为你不需要刷新页面!
          • 我继续往下看,答案越来越好,很有趣。但这是最好的,别看这里了。
          • 仅供参考,如果您使用路径设置 cookie,则还需要在此 setcookie 调用中包含路径:setcookie('key', '', time() - 3600, '/');
          • @Gavin 感谢您的提示。我想知道为什么它没有删除,而是 unsetting 成功。
          • 对于任何正在检查 cookie 的存在并关心具有 null 值的 cookie 的人,您需要使用 array_key_exists() 代替,因为具有 null 值的 cookie 不会不会被isset() 检查找到。
          【解决方案13】:

          我知道这个主题创建已经有很长时间了,但是我在这个解决方案中看到了一个小错误(我可以这样称呼它,因为它是一个细节)。 我同意更好的解决方案可能是这个解决方案:

          if (isset($_COOKIE['remember_user'])) {
                      unset($_COOKIE['Hello']);
                      unset($_COOKIE['HelloTest1']);
                      setcookie('Hello', null, -1, '/');
                      setcookie('HelloTest1', null, -1, '/');
                      return true;
                  } else {
                      return false;
                  }
          

          但是,在目前的情况下,在 unset 功能起作用的所有情况下,您都会删除 cookie,并在 unset 功能不起作用的情况下立即创建新的过期 cookie。

          这意味着即使 unset 功能起作用,它仍然会在计算机上保存 2 个 cookie。 从逻辑的角度来看,所要求的目标是在可能的情况下删除 cookie,如果确实不是,则使其过期;获得“最干净”的结果。

          所以,我认为我们应该这样做:

          if (isset($_COOKIE['remember_user'])) {
                      setcookie('Hello', null, -1, '/');
                      setcookie('HelloTest1', null, -1, '/');
                      unset($_COOKIE['Hello']);
                      unset($_COOKIE['HelloTest1']);
                      return true;
                  } else {
                      return false;
                  }
          

          谢谢,祝你有美好的一天:)

          【讨论】:

          • Function unset 用于 PHP 的逻辑(如果你想使用变量 $_COOKIE['Hello'],你不能因为它没有设置)。并且函数 setcookie 是为导航器设计的。 2种不同的用途,函数的顺序对实际代码没有影响。
          • 事实上,我知道是的,但如果你绝对想确定 cookie 已被取消设置/删除,所以你使用这两种解决方案,在使这些过期之前会更干净然后取消设置这些而不是取消设置这些然后重新创建一个过期的cookie...如果你明白我的意思吗?
          • 是的,很抱歉刚刚回复:) 我已经发送了它,因为我看到人们以另一种方式这样做......但我认为这样看起来更聪明。
          • Cookie 值必须是字符串。在这种情况下,一个空字符串:''。也许null 会产生一个警告...见PHP: setcookie()
          【解决方案14】:

          您可以简单地使用这个自定义功能:

          function unset_cookie($cookie_name) {
              if (isset($_COOKIE[$cookie_name])) {
                  unset($_COOKIE[$cookie_name]);
                  setcookie($cookie_name, null, -1);
              } else { return false; }
          }
          

          如果您想删除 $_COOKIE['user_account']。
          只需使用:

          unset_cookie('user_account');
          

          【讨论】:

            【解决方案15】:

            如果你想“删除”cookie,只需将过期日期设置为一小时前,如下所示:

            setcookie ("TestCookie", "", time() - 3600);
            

            setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", "example.com", 1);
            

            来源:http://www.php.net/manual/en/function.setcookie.php

            您应该对访问者可以输入/操作的所有全局变量使用 filter_input() 函数,如下所示:

            $visitors_ip = filter_input(INPUT_COOKIE, 'id');
            

            您可以在此处阅读更多信息:http://www.php.net/manual/en/function.filter-input.php 和此处:http://www.w3schools.com/php/func_filter_input.asp

            【讨论】:

            • 而不是 time() - 3600 你应该设置 1(unix epoc 之后 1 秒)
            【解决方案16】:

            我的代码中有同样的问题,发现是 cookie 路径问题。查看此堆栈溢出帖子:Can't delete php set cookie

            我使用路径值“/”设置了 cookie,但是当我尝试清除它时没有任何路径值,所以它没有清除。所以这里是一个有效的例子:

            设置cookie:

            $cookiePath = "/";
            $cookieExpire = time()+(60*60*24);//one day -> seconds*minutes*hours
            setcookie("CookieName",$cookieValue,$cookieExpire,$cookiePath);
            

            清除cookie:

            setcookie("cookieName","", time()-3600, $cookiePath);
            unset ($_COOKIE['cookieName']);
            

            希望对您有所帮助。

            【讨论】:

              【解决方案17】:

              要删除您可以编写的所有 cookie:

              foreach ($_COOKIE as $key => $value) {
                  unset($value);
                  setcookie($key, '', time() - 3600);
              }
              

              【讨论】:

              • 这实际上不会删除 cookie,除非它们具有与 setcookie 的默认设置相同的路径和域设置。
              【解决方案18】:

              要删除 cookie,您只需将值设置为 NULL:

              “如果您为过期时间、路径或域设置了具有非默认值的 cookie,则在删除 cookie 时必须再次提供这些相同的值才能正确删除 cookie。” 引用自“Learning PHP5”一书。

              所以这段代码应该可以工作(对我有用):

              设置cookie: setcookie('foo', 'bar', time() + 60 * 5);

              删除 cookie: setcookie('foo', '', time() + 60 * 5);

              但我注意到每个人都将到期日期设置为过去,这是必要的,为什么?

              【讨论】:

              • 它是可靠的,这就是为什么。将值设置为空和过去的某个时间(但不会太远,因为 IE 偶尔不喜欢它与我所读的内容相差太远)的组合可以全面发挥作用。
              • 空字符串''null不是一回事。
              【解决方案19】:

              您可以根据 cookie 值设置会话变量

              session_start();
              
              if(isset($_COOKIE['loggedin']) && ($_COOKIE['loggedin'] == "true") ){
              $_SESSION['loggedin'] = "true";
              }
              
              echo ($_SESSION['loggedin'] == "true" ? "You are logged in" : "Please Login to continue");
              

              【讨论】:

                【解决方案20】:

                这将在您的代码中取消设置 cookie,但由于 $_COOKIE 变量在每次请求时都会刷新,它只会在下一页请求时返回。

                要真正摆脱 cookie,请将过期日期设置为过去:

                // set the expiration date to one hour ago
                setcookie("hello", "", time()-3600);
                

                【讨论】:

                • 不需要unset() cookie 吗?
                • @PratikCJoshi 仅当您的代码稍后查找它时。
                • 你应该设置 1 而不是 time()-3600 (unix epoq 后 1 秒)
                【解决方案21】:

                如果您将 cookie 设置为过去过期,浏览器会将其删除。见setcookie() delete example at php.net

                【讨论】:

                  【解决方案22】:

                  请参阅 PHP 文档中标记为“Example #2 setcookie() delete example”的示例。要从浏览器中清除 cookie,您需要告诉浏览器 cookie 已过期......然后浏览器将删除它。 unset 使用它只是从 COOKIE 数组中删除 'hello' cookie。

                  【讨论】:

                    【解决方案23】:

                    将值设置为“”,并将到期日期设置为昨天(或过去的任何日期)

                    setcookie("hello", "", time()-3600);
                    

                    那么cookie会在下次页面加载时过期。

                    【讨论】:

                    • 如何将时间设置为 0(纪元)? =]
                    • 如果你把一个日期放在过去太远,IE 会叫它并忽略它,即不会删除该值。
                    • @strager manual 声明:如果设置为 0 或省略,cookie 将在会话结束时(浏览器关闭时)过期。 那不是真正删除cookie。我真的不知道 IE 会不会像 Julien 说的那样做,但是 IE 很可能会做一些奇怪的事情。
                    • 另外,不要忘记实际取消设置($_COOKIE["hello"]),因为如果页面的其余部分有代码查看$_COOKIE["hello"],它仍然会找到它。我刚被这个咬了一口。
                    • 加上设置路径是个好主意,所以 setcookie('hello', '', time()-3600, '/');
                    猜你喜欢
                    • 1970-01-01
                    • 2011-11-25
                    • 2017-11-08
                    • 2010-12-18
                    • 2018-01-21
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-07-22
                    相关资源
                    最近更新 更多