簡體   English   中英

如何在php中刪除我網站的所有cookie

[英]how to delete all cookies of my website in php

我想知道當用戶單擊注銷時是否可以刪除我網站的所有 cookie,因為我使用它作為刪除 cookie 的功能,但它無法正常工作:

setcookie("user",false);

有沒有辦法在 PHP 中刪除一個域的 cookie?

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

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

然而,更好的是記住(或將其存儲在某個地方)您的應用程序在域上設置了哪些 cookie,並直接刪除所有這些 cookie。
這樣您就可以確保正確刪除所有值。

我同意上面的一些答案。 我只建議用“1”替換“time()-1000”。 值“1”表示 1970 年 1 月 1 日,可確保 100% 到期。 所以:

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

確保在您的網站上發生任何輸出之前調用您的 setcookie 函數。

此外,如果您的用戶正在注銷,您還應該刪除/使他們的會話變量無效。

提供的答案沒有解決我的問題,

它沒:

  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, '.')));
    }
}

它不是最漂亮/安全/最佳的解決方案,因此僅當您不知道 cookie 路徑和/或 cookie 域時才使用它。 或者使用這個想法來創建你的版本。

當您更改 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

以前的所有答案都忽略了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);
}

您應該知道 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。

使用函數清除cookies:

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數據,否則保留會話數據。

我知道這個問題很老,但這是一個更簡單的選擇:

header_remove();

不過要小心! 文檔所述,它將刪除所有標頭,包括 Cookie、會話等。

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

我不得不將以下內容添加到最佳答案中,以實際刪除一些不會消失的 cookie:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM