我想知道当用户单击注销时是否可以删除网站的所有cookie,因为我将其用作删除cookie的功能,但无法正常工作:
setcookie("user",false);
有没有一种方法可以在PHP中删除一个域的Cookie?
Answers:
从该页面获取的信息将取消设置您域的所有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_COOKIE
值比遍历$_COOKIE
数组更好。你有什么理由吗?在我看来,解析器仅需要更多(双重)工作。
$past = time() - 3600;
foreach ( $_COOKIE as $key => $value )
{
setcookie( $key, $value, $past, '/' );
}
但是,更好的办法是记住(或将其存储在某个域中)与您的应用程序一起设置的cookie,并直接删除所有cookie。
这样,您可以确保正确删除所有值。
setcookie( $key, FALSE );
?!(请参阅php.net/manual/en/function.setcookie.php上的Notes选段)
/
您需要放入决赛setcookie
吗?
/
是Cookie路径。您需要对其进行设置,以便可以从域中删除cookie,否则它将被设置为当前路径,并且只会影响为当前路径设置的cookie。
我同意上述一些答案。我只建议将“ time()-1000”替换为“ 1”。值“ 1”表示1970年1月1日,它确保有效期为100%。因此:
setcookie($name, '', 1);
setcookie($name, '', 1, '/');
当您更改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
提供的答案无法解决我的问题,
它没有:
我的脚本确实可以看到。
<?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域的情况下才使用此解决方案。或使用该构想来创建您的版本。
您应该注意各种跟踪工具,例如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。
0
参数意味着cookie在传输过程中甚至没有被加密。
以前的所有答案都忽略了setcookie
可以用于显式域。此外,该cookie可能已在更高的子域中设置,例如,如果您在foo.bar.tar.com
域中,则可能在上设置了cookie tar.com
。因此,您要为所有可能已删除Cookie的域取消设置Cookie:
$host = explode('.', $_SERVER['HTTP_HOST']);
while ($host) {
$domain = '.' . implode('.', $host);
foreach ($_COOKIE as $name => $value) {
setcookie($name, '', 1, '/', $domain);
}
array_shift($host);
}
使用该功能清除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
数据,否则将保留会话数据。
<?php
parse_str(http_build_query($_COOKIE),$arr);
foreach ($arr as $k=>$v) {
setCookie("$k","",1000,"/");
}