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

PHP setcookie() 完整用法指南:參數詳解、常見坑與最佳實踐

     編輯:PHP 相關知識

PHP setcookie() 完整用法指南:參數詳解、常見坑與最佳實踐

`setcookie()` 向客戶端發送 HTTP Cookie,必須在**任何輸出之前**調用。Cookie 由伺服器寫入瀏覽器,後續請求自動攜帶。本文涵蓋語法、參數、編碼行為、刪除技巧、陣列 Cookie 及跨域作用域配置。

語法與參數表

setcookie(string $name, string $value = "", int $expire = 0, string $path = "", string $domain = "", bool $secure = false, bool $httponly = false): bool
參數必要說明建議值
name是Cookie 名稱英文字母數字底線
value是Cookie 值,自動 URL 編碼避免逗號分號空格
expire否Unix 時間戳過期時間,0=會話結束time()+3600 (1小時)
path否生效路徑,/ 表示全站"/"
domain否生效域名,.example.com 含子域".yourdomain.com"
secure否僅 HTTPS 傳輸true (生產環境)
httponly否JS 無法讀取,防 XSStrue

核心範例

1. 基礎設定與過期控制

<?php
$value = "my cookie value";
// 會話級 Cookie (關閉瀏覽器失效)
setcookie("TestCookie", $value);

// 持久化 Cookie (24 小時)
setcookie("TestCookie", $value, time() + 3600 * 24);
?>

2. 讀取 Cookie 多種方式

<?php
// 單一 Cookie (PHP 4.1+ 推薦)
echo $_COOKIE["TestCookie"];

// 相容舊版 (已棄用)
echo $HTTP_COOKIE_VARS["TestCookie"];

// 列印所有 Cookie
print_r($_COOKIE);

3. 刪除 Cookie:設定過去時間

<?php
// 1 小時前過期即刪除
setcookie("TestCookie", "", time() - 3600);
// 必須保持 path、domain 與設定時一致才能生效

4. 陣列式 Cookie (自動解析為關聯陣列)

<?php
setcookie("cookie[three]", "cookiethree");
setcookie("cookie[two]", "cookietwo");
setcookie("cookie[one]", "cookieone");

// 重新整理後讀取
if (isset($_COOKIE["cookie"])) {
    foreach ($_COOKIE["cookie"] as $name => $value) {
        echo "$name : $value
"; } } // 輸出順序:three → two → one (依設定順序)

5. 跨子域共享 Cookie (關鍵:path + domain)

<?php
// 所有子域 *.hi-docs.com 可讀,全站路徑生效
setcookie("a", "bb", time() + 3600, "/", ".hi-docs.com");
// 注意:domain 必須以點開頭,且僅允許當前域或父域

常見問題與解決方案

現象原因解決
設定後立即 $_COOKIE 讀不到Cookie 隨下一次請求才發送重新整理頁面或跳轉後讀取
子域無法讀取主域 Cookiedomain 未設為 .example.comsetcookie(..., "/", ".example.com")
HTTPS 頁面 Cookie 丟失secure=true 但測試環境非 HTTPS開發環境設 false,生產設 true
中文值亂碼自動 URL 編碼/解碼讀取時無需處理,或用 setrawcookie() 禁用編碼
同名 Cookie 覆蓋混淆path/domain 不同視為不同 Cookie統一 path="/", domain=".main.com"

安全強化清單

  • HttpOnly:`setcookie(..., true, true)` 防 JS 竊取
  • Secure:全站 HTTPS 時必開
  • SameSite:PHP 7.3+ `setcookie(..., ['samesite' => 'Lax'])` 防 CSRF
  • 簽名驗證:敏感資料 `hash_hmac('sha256', $value, $secret)` 存入,讀取驗證防篡改
  • 加密儲存:`openssl_encrypt()` 加密後寫入 Cookie

進階:手動控制 Header (適用於已有輸出場景)

<?php
// 直接發送 Set-Cookie 標頭,繞過輸出限制
header("Set-Cookie: name=value; Path=/; Domain=.example.com; Max-Age=3600; HttpOnly; Secure; SameSite=Lax", false);
// false 表示允許同名標頭多次發送 (多個 Cookie)

測試檢查清單

  1. 開發者工具 Application → Cookies 確認屬性
  2. 檢查 `Expires/Max-Age` 是否符合預期
  3. 驗證 `Domain`、`Path` 範圍正確
  4. 確認 `HttpOnly`、`Secure`、 `SameSite` 狀態
  5. 跨子域測試:a.example.com 設定,b.example.com 讀取

核心口訣:輸出前調用、路徑域正確、安全屬性全開、刪除設過期、陣列用方括號、跨域加點頭。

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