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

Mac*_*lor 89 php cookies

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

setcookie("user",false);
Run Code Online (Sandbox Code Playgroud)

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

jas*_*bar 164

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, '/');
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • @poke:如果cookie名称是数组表示法,例如:user [username]那么PHP将自动在$ _COOKIE中创建一个相应的数组.而是使用$ _SERVER ['HTTP_COOKIE'],因为它镜像实际的HTTP请求标头. (11认同)
  • 我读了那个评论,但我真的不明白为什么使用`HTTP_COOKIE`值比循环通过`$ _COOKIE`数组更好.你有什么理由吗?对我而言,解析器看起来只有更多(双重)工作. (9认同)
  • 我见过有2个cookie名称相同,但域名设置不同的情况.其中一个将进入$ _COOKIE数组,另一个则不会.但它们都会在HTTP_COOKIE中可见.如果你想清理这种情况,这就是这样做的方法. (2认同)

pok*_*oke 40

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

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

  • 伟大的代码,但不应该使用`setcookie($ key,FALSE);`?!(参见http://www.php.net/manual/en/function.setcookie.php上的注释情节) (2认同)

Dou*_*oug 15

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

setcookie($name, '', 1);
setcookie($name, '', 1, '/');
Run Code Online (Sandbox Code Playgroud)


Wes*_*uis 6

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

它没有:

  1. 删除父域 cookie(从 abc;删除 bc;cookie),
  2. 从 root 以外的更高路径中删除 cookie。

我的脚本确实如此,瞧。

<?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, '.')));
    }
}
Run Code Online (Sandbox Code Playgroud)

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