ユーザーがログアウトをクリックしたときにウェブサイトのすべてのCookieを削除できるかどうか疑問に思っています。これはCookieを削除する機能としてこれを使用しましたが、正しく機能しないためです:
setcookie("user",false);
PHPで1つのドメインのCookieを削除する方法はありますか?
そのページから取得すると、ドメインのすべての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, '/');
}
}
$past = time() - 3600;
foreach ( $_COOKIE as $key => $value )
{
setcookie( $key, $value, $past, '/' );
}
ただし、ドメインのアプリケーションでどのCookieが設定されているかを記憶(またはどこかに保存)し、それらをすべて直接削除することをお勧めします。
これにより、すべての値を正しく削除することができます。
上記の回答のいくつかに同意します。 「time()-1000」を「1」に置き換えることをお勧めします。値「1」は1970年1月1日を意味し、100%の有効期限が保証されます。したがって:
setcookie($name, '', 1);
setcookie($name, '', 1, '/');
サイトで出力が行われる前に、setcookie関数を呼び出してください。
また、ユーザーがログアウトしている場合は、セッション変数も削除/無効化する必要があります。
Cookieの名前を変更する場合、すべてのCookieを削除するが、1つの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
私はこの質問が古いことを知っていますが、これははるかに簡単な代替案です。
header_remove();
しかし、注意してください! ドキュメント で説明されているように、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-pathやcookie-domainを知らない場合にのみ使用してください。または、アイデアを使用してバージョンを作成してください。
Googleアナリティクスなどのさまざまな追跡ツールもドメインでCookieを使用しているため、GAで正しいデータを取得したい場合は削除しないでください。
動作する唯一のソリューションは、既存のCookieをnullに設定することでした。クライアントからCookieを削除できませんでした。
したがって、ユーザーをログアウトするには、次を使用します。
setcookie("username", null, time()+$this->seconds, "/", $this->domain, 0);
setcookie("password", null, time()+$this->seconds, "/", $this->domain, 0);
もちろん、これですべてのCookieが削除されるわけではありません。
関数を使用して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
データがクリアされます。そうでない場合、セッションデータは保持されます。
以前の回答はすべて、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);
}