首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 刪除 Cookie 的正確姿勢:設定過期時間與陷阱避坑

     編輯:PHP 相關知識

PHP 刪除 Cookie 的正確姿勢

刪除 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() 之前的時間戳)。
  • path、domain、secure、httponly 等參數必須與設定時**完全一致**,否則瀏覽器不會匹配刪除。

隱藏陷阱:空值直接觸發刪除

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

最佳實踐建議

  1. 明確刪除:始終使用 setcookie('name', '', time() - 3600, $path, $domain, $secure, $httponly),語意清晰、可控。
  2. 避免依賴空值副作用:若真需將 Cookie 值設為空字串(保留 Cookie 但清空內容),請改用 setcookie('name', ' ', ...)(單一空格)或其他佔位符。
  3. 統一管理:封裝 set_cookie() / delete_cookie() 助手函數,集中處理 path/domain/secure/httponly 預設值,減少參數不一致導致刪除失敗。

理解 PHP 內部對空值的特殊處理,能避免「想清空值卻誤刪 Cookie」的困擾。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved