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

PHP Cookie 設定為「瀏覽器進程」生命週期的正確姿勢與常見誤區

     編輯:PHP 綜合知識

問題現場

<?php
$USERID = "PHPer";
$CookieTime = 0;
setcookie("USERID", "$USERID", time() + $CookieTime, "/", "btcuxiao.com");

執行後 Cookie 為空,換頁即失效。開發者誤以為 time()+0 代表「瀏覽器進程」,實則不然。

核心誤區拆解

誤區錯誤代碼正確認知
過期時間計算time() + 0 = 當前 Unix 時間戳直接設為 0 才代表 Session Cookie(瀏覽器關閉即失效)
Domain 設定"btcuxiao.com"需 ".btcuxiao.com"(前綴點)支援子域名,或留空由瀏覽器自動推導
即時可讀性設定後立即 $_COOKIE['USERID']Cookie 需下一次 HTTP 請求才會出現在 $_COOKIE 中

正確代碼示範

<?php
$USERID = "PHPer";

// 瀏覽器進程 Cookie:expire = 0,domain 留空(當前域名),path = "/"
setcookie("USERID", $USERID, 0, "/", "");

// 驗證:首次請求無輸出,重新整理後顯示
echo isset($_COOKIE['USERID']) ? $_COOKIE['USERID'] : '尚未生效(請重新整理)';

Cookie 參數完整解析

setcookie(
    string $name,           // Cookie 名稱
    string $value = "",     // 值(自動 urlencode)
    int $expires = 0,       // 過期時間:0=Session Cookie;Unix 時間戳=持久 Cookie
    string $path = "/",     // 生效路徑,"/" 代表全站
    string $domain = "",    // 生效域名:""=當前域;".example.com"=含子域
    bool $secure = false,   // 僅 HTTPS 傳輸
    bool $httponly = false  // 禁止 JS 存取(防 XSS)
);

Domain 參數深度解析

設定值生效範圍適用場景
""(留空)當前主機名(不含子域)單域名應用、本地開發
".example.com"example.com 及所有子域(a.example.com, b.a.example.com)多子域共享登入態(SSO)
"example.com"僅 example.com(現代瀏覽器同 ".example.com",但標準建議加點)不推薦
"sub.example.com"僅指定子域隔離子域 Cookie

關鍵規則:Domain 必須包含當前請求的主機名,否則瀏覽器拒絕設定(安全策略)。

「當前頁面無法讀取剛設定的 Cookie」的本質

// 請求 1:瀏覽器 → 伺服器
// 無 Cookie 標頭
// 伺服器執行 setcookie() → 回應攜帶 Set-Cookie 標頭
// 瀏覽器接收,寫入記憶體(Session Cookie)或硬碟(持久 Cookie)

// 請求 2:瀏覽器 → 伺服器(重新整理/跳轉)
// 瀏覽器自動附加 Cookie 標頭
// 伺服器 $_COOKIE 才有值

這是 HTTP 協議無狀態特性 決定的:Cookie 是下一次請求才隨標頭發送的。

常見場景最佳實踐

1. 登入記憶(持久 Cookie,30 天)

setcookie('remember_token', $token, time() + 30*86400, '/', '.example.com', true, true);

2. 購物車/暫存狀態(Session Cookie)

setcookie('cart_session', $cartId, 0, '/', '', true, true);

3. 跨子域單點登入

// 主域登入後
setcookie('sso_token', $token, 0, '/', '.example.com', true, true);
// 子域讀取即可共享

4. 刪除 Cookie

setcookie('name', '', time() - 3600, '/', '.example.com'); // 過期時間設過去

安全屬性雙雄:Secure + HttpOnly

  • Secure:僅 HTTPS 傳輸,防中間人竊聽。生產環境強制開啟。
  • HttpOnly:禁止 document.cookie 存取,防 XSS 竊取 Session ID。所有認證類 Cookie 必開。
// 現代框架預設行為(Laravel/Symfony/ThinkPHP)
setcookie($name, $value, $expire, $path, $domain, true, true);

調試技巧

  1. 瀏覽器開發者工具 → Application/Storage → Cookies:檢查 Domain、Path、Expires、HttpOnly、Secure 欄位
  2. 網路面板 → 請求標頭:確認 Cookie: 是否正確發送
  3. 回應標頭:確認 Set-Cookie: 格式、屬性是否符合預期
  4. 命令列測試:curl -v -b cookies.txt -c cookies.txt https://example.com/

總結

PHP setcookie() 看似簡單,實則蘊含 HTTP 協議、瀏覽器安全模型、域名匹配規則 等多層知識。核心要訣:

  1. Session Cookie = expire 0,非 time()+0
  2. Domain 加點支援子域,留空鎖定當前主機
  3. 下一請求才可讀,不要當頁驗證
  4. 生產環境必開 Secure + HttpOnly

掌握這些,即可駕馭從「記住我」到「跨域單點登入」的所有 Cookie 場景。

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