`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 無法讀取,防 XSS | true |
<?php
$value = "my cookie value";
// 會話級 Cookie (關閉瀏覽器失效)
setcookie("TestCookie", $value);
// 持久化 Cookie (24 小時)
setcookie("TestCookie", $value, time() + 3600 * 24);
?>
<?php
// 單一 Cookie (PHP 4.1+ 推薦)
echo $_COOKIE["TestCookie"];
// 相容舊版 (已棄用)
echo $HTTP_COOKIE_VARS["TestCookie"];
// 列印所有 Cookie
print_r($_COOKIE);
<?php
// 1 小時前過期即刪除
setcookie("TestCookie", "", time() - 3600);
// 必須保持 path、domain 與設定時一致才能生效
<?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 (依設定順序)
<?php
// 所有子域 *.hi-docs.com 可讀,全站路徑生效
setcookie("a", "bb", time() + 3600, "/", ".hi-docs.com");
// 注意:domain 必須以點開頭,且僅允許當前域或父域
| 現象 | 原因 | 解決 |
|---|---|---|
| 設定後立即 $_COOKIE 讀不到 | Cookie 隨下一次請求才發送 | 重新整理頁面或跳轉後讀取 |
| 子域無法讀取主域 Cookie | domain 未設為 .example.com | setcookie(..., "/", ".example.com") |
| HTTPS 頁面 Cookie 丟失 | secure=true 但測試環境非 HTTPS | 開發環境設 false,生產設 true |
| 中文值亂碼 | 自動 URL 編碼/解碼 | 讀取時無需處理,或用 setrawcookie() 禁用編碼 |
| 同名 Cookie 覆蓋混淆 | path/domain 不同視為不同 Cookie | 統一 path="/", domain=".main.com" |
<?php
// 直接發送 Set-Cookie 標頭,繞過輸出限制
header("Set-Cookie: name=value; Path=/; Domain=.example.com; Max-Age=3600; HttpOnly; Secure; SameSite=Lax", false);
// false 表示允許同名標頭多次發送 (多個 Cookie)
核心口訣:輸出前調用、路徑域正確、安全屬性全開、刪除設過期、陣列用方括號、跨域加點頭。