如何在php中删除我网站的所有cookie

时间:2010-02-22 11:34:00

标签: php cookies

我想知道当用户点击退出时我是否可以删除我所有网站的cookie,因为我使用此功能来删除cookie但是它无法正常工作:

setcookie("user",false);

有没有办法在PHP中删除一个域的cookie?

12 个答案:

答案 0 :(得分:159)

PHP setcookie()

从该页面获取,这将取消设置您域名的所有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, '/');
    }
}

http://www.php.net/manual/en/function.setcookie.php#73484

答案 1 :(得分:40)

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

然而,更好的是记住(或存储在某个地方)哪些cookie随域中的应用程序设置并直接删除所有这些。
这样您就可以确保正确删除所有值。

答案 2 :(得分:14)

我同意上面的一些答案。我建议将“time() - 1000”替换为“1”。值“1”表示1970年1月1日,确保到期100%。因此:

setcookie($name, '', 1);
setcookie($name, '', 1, '/');

答案 3 :(得分:3)

确保在您的网站上发生任何输出之前调用您的setcookie功能。

另外,如果您的用户正在注销,您还应该删除/使其会话变量无效。

答案 4 :(得分:2)

当您更改Cookie的名称时,您可能还想删除所有Cookie,但保留一个:

if (isset($_COOKIE)) {
    foreach($_COOKIE as $name => $value) {
        if ($name != "preservecookie") // Name of the cookie you want to preserve 
        {
            setcookie($name, '', 1); // Better use 1 to avoid time problems, like timezones
            setcookie($name, '', 1, '/');
        }
    }
}

同样基于此PHP-Answer

答案 5 :(得分:2)

我知道这个问题很老,但这是一个更容易的选择:

header_remove();

但要小心!它将删除所有标题,包括Cookie,会话等,如the docs中所述。

答案 6 :(得分:2)

提供的答案并没有解决我的问题,

没有:

  1. 删除父域Cookie(来自a.b.c;删除b.c; Cookie),
  2. 从root以外的更高路径中删除Cookie。
  3. 我的脚本确实如此。

    <?php function unset_cookie($name)
    {
        $host = $_SERVER['HTTP_HOST'];
        $domain = explode(':', $host)[0];
    
        $uri = $_SERVER['REQUEST_URI'];
        $uri = rtrim(explode('?', $uri)[0], '/');
    
        if ($uri && !filter_var('file://' . $uri, FILTER_VALIDATE_URL)) {
            throw new Exception('invalid uri: ' . $uri);
        }
    
        $parts = explode('/', $uri);
    
        $cookiePath = '';
        foreach ($parts as $part) {
            $cookiePath = '/'.ltrim($cookiePath.'/'.$part, '//');
    
            setcookie($name, '', 1, $cookiePath);
    
            $_domain = $domain;
            do {
                setcookie($name, '', 1, $cookiePath, $_domain);
            } while (strpos($_domain, '.') !== false && $_domain = substr($_domain, 1 + strpos($_domain, '.')));
        }
    }
    

    它不是最漂亮/安全/最佳的解决方案,因此只有在您不知道cookie路径和/或cookie域的情况下才使用此解决方案。或者使用这个想法来创建你的版本。

答案 7 :(得分:1)

您应该了解各种跟踪工具,例如Google Analytics也会在您的域中使用Cookie,如果您想在GA中使用正确的数据,则不想删除它们。

我能解决的唯一解决方案是将现有的cookie设置为null。我无法从客户端删除cookie。

因此,为了记录用户,我使用以下内容:

setcookie("username", null, time()+$this->seconds, "/", $this->domain, 0);
setcookie("password", null, time()+$this->seconds, "/", $this->domain, 0);

当然这不会删除所有Cookie。

答案 8 :(得分:0)

以前的所有答案都忽略了setcookie可能与显式域一起使用。此外,cookie可能已设置在更高的子域上,例如如果您在foo.bar.tar.com域中,则可能会在tar.com上设置Cookie。因此,您要为可能丢弃cookie的所有域取消设置cookie:

$host = explode('.', $_SERVER['HTTP_HOST']);

while ($host) {
    $domain = '.' . implode('.', $host);

    foreach ($_COOKIE as $name => $value) {
        setcookie($name, '', 1, '/', $domain);
    }

    array_shift($host);
}

答案 9 :(得分:0)

使用此功能清除Cookie:

function clearCookies($clearSession = false)
{
    $past = time() - 3600;
    if ($clearSession === false)
        $sessionId = session_id();
    foreach ($_COOKIE as $key => $value)
    {
        if ($clearSession !== false || $value !== $sessionId)
            setcookie($key, $value, $past, '/');
    }
}

如果您传递true,则会清除session数据,否则会保留会话数据。

答案 10 :(得分:-1)

<?php
      parse_str(http_build_query($_COOKIE),$arr);
      foreach ($arr as $k=>$v) {
        setCookie("$k","",1000,"/");
      }

答案 11 :(得分:-1)

我必须将以下内容添加到最佳答案中才能真正删除一些不会消失的 cookie:

foreach($_COOKIE as $cook) {
    setcookie($cook, '', time()-1000);
    setcookie($cook, '', time()-1000, '/');
}