刪除 Cookie 的本質是**讓瀏覽器認為 Cookie 已過期**,從而觸發其清除機制。標準做法是將 expire 參數設為**過去的時間點**。
<?php
// 刪除名為 'TestCookie' 的 Cookie
setcookie('TestCookie', '', time() - 3600); // 過期時間設為 1 小時前
// 若設定時指定了 path、domain、secure,刪除時必須完全一致
setcookie('TestCookie', '', time() - 3600, '/~rasmus/', '.example.com', true);
?>
value 設為空字串 ''。expire 設為 time() - 3600(或任何 time() 之前的時間戳)。PHP 內部原始碼 (ext/standard/head.c) 含有特殊邏輯:
if (value && value_len == 0) { // 為了相容 IE,將空值視為刪除指令 time_t t = time(NULL) - 31536001; // 1 年零 1 秒前 // 產生 Set-Cookie: name=deleted; expires=... }
因此,**setcookie('name', '') 或 setcookie('name', null) 會直接導致 Cookie 被刪除**,而非單純設為空值。這在官方文件中鮮少明確說明,易造成誤解。
<?php
setcookie('testcookie', ''); // 僅設空值
header('Refresh: 0'); // 重新整理以觀察 $_COOKIE 變化
print_r($_COOKIE); // 會發現 testcookie 已從陣列消失
?>
抓包可見回應標頭:
Set-Cookie: testcookie=deleted; expires=Mon, 18-Jun-2007 02:42:33 GMT
setcookie('name', '', time() - 3600, $path, $domain, $secure, $httponly),語意清晰、可控。setcookie('name', ' ', ...)(單一空格)或其他佔位符。set_cookie() / delete_cookie() 助手函數,集中處理 path/domain/secure/httponly 預設值,減少參數不一致導致刪除失敗。理解 PHP 內部對空值的特殊處理,能避免「想清空值卻誤刪 Cookie」的困擾。