Мне интересно, могу ли я удалить все файлы cookie моего веб-сайта, когда пользователь нажимает на выход, потому что я использовал это как функцию для удаления файлов cookie, но она работает неправильно:
setcookie("user",false);
Есть ли способ удалить файлы cookie одного домена в PHP?
Ответы:
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
источник
HTTP_COOKIE
значения было бы лучше, чем цикл по$_COOKIE
массиву. У вас есть для этого какие-то причины? Для меня это только похоже на дополнительную (двойную) работу для парсера.$past = time() - 3600; foreach ( $_COOKIE as $key => $value ) { setcookie( $key, $value, $past, '/' ); }
Однако еще лучше запомнить (или где-нибудь сохранить), какие файлы cookie установлены с вашим приложением в домене, и удалить их напрямую.
Таким образом, вы можете быть уверены, что удалили все значения правильно.
источник
setcookie( $key, FALSE );
?! (см. схему заметок на php.net/manual/en/function.setcookie.php )/
тебе финалsetcookie
?/
к файлу cookie. Вам необходимо настроить его так, чтобы вы могли удалить файлы cookie из домена, в противном случае он будет установлен на текущий путь и влияет только на те, которые установлены для текущего пути.Я согласен с некоторыми из приведенных выше ответов. Я бы просто рекомендовал заменить «time () - 1000» на «1». Значение «1» означает 1 января 1970 г., что обеспечивает 100% истечение срока. Следовательно:
setcookie($name, '', 1); setcookie($name, '', 1, '/');
источник
убедитесь, что вы вызываете функцию setcookie до того, как на вашем сайте появится какой-либо вывод.
Кроме того, если ваши пользователи выходят из системы, вы также должны удалить / сделать недействительными их переменные сеанса.
источник
Когда вы меняете имя своих файлов 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-ответа
источник
Предоставленные ответы не решили мою проблему,
Не было:
Мой сценарий делает, понимаете.
<?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
домене, там мог быть установлен cookietar.com
. Таким образом, вы хотите отключить файлы 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
данные, в противном случае данные сеанса сохраняются.источник
Я знаю, что это старый вопрос, но это гораздо более простая альтернатива:
Но будь осторожен! Он удалит ВСЕ заголовки, включая файлы cookie, сеанс и т. Д., Как описано в документации .
источник
<?php parse_str(http_build_query($_COOKIE),$arr); foreach ($arr as $k=>$v) { setCookie("$k","",1000,"/"); }
источник