Cookie 是 HTTP 協議中維持狀態的關鍵機制。PHP setcookie() 函數用於定義並隨 HTTP 標頭一同發送 Cookie。由於協議限制,**Cookie 必須在任何輸出(包含 HTML 標籤、空白字元)之前發送**,否則函數會失敗回傳 FALSE。
bool setcookie (
string $name,
string $value = "",
int $expire = 0,
string $path = "",
string $domain = "",
bool $secure = false,
bool $httponly = false // PHP 5.2.0+ 新增
)
| 參數 | 說明 | 範例 / 備註 |
|---|---|---|
name |
Cookie 名稱 | 透過 $_COOKIE['cookiename'] 讀取 |
value |
Cookie 值(儲存在客戶端) | 切勿存放敏感資料(密碼、Token 等) |
expire |
過期時間(Unix 時間戳) | time() + 3600 = 1 小時後過期;0 或省略 = 瀏覽器關閉即失效(Session Cookie) |
path |
伺服器端有效路徑 | / = 整個網域有效;/foo/ = 僅 /foo/ 及子目錄有效;預設為當前目錄 |
domain |
有效網域 | .example.com = 所有子網域有效(建議加前導點以相容更多瀏覽器);www.example.com = 僅 www 子網域 |
secure |
僅 HTTPS 傳輸 | true = 只在安全連線發送;預設 false |
httponly |
禁止 JavaScript 存取 | true 可緩解 XSS 攻擊風險(PHP 5.2.0+ 支援) |
$value = 'something from somewhere';
setcookie('TestCookie', $value); // Session Cookie
setcookie('TestCookie', $value, time() + 3600); // 1 小時後過期
setcookie('TestCookie', $value, time() + 3600, '/~rasmus/', '.utoronto.ca', 1); // 完整參數
echo $_COOKIE['TestCookie'];
echo $HTTP_COOKIE_VARS['TestCookie']; // 老版本相容
print_r($_COOKIE); // 除錯:列出所有 Cookie
將過期時間設為過去時間點,觸發瀏覽器刪除機制:
setcookie('TestCookie', '', time() - 3600);
setcookie('TestCookie', '', time() - 3600, '/~rasmus/', '.utoronto.ca', 1);
利用名稱中的方括號語法,可一次設定多個關聯值:
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 : cookiethree
two : cookietwo
one : cookieone
*/
Cookie 值在發送時會自動 urlencode,接收時自動 urldecode。若不想要此行為(PHP 5+),可改用 setrawcookie()。
/:確保整站共用同一 Cookie,避免子目錄下無法讀取。.example.com 相容性優於 example.com,涵蓋所有子網域。domain=.example.com,子網域即可讀取。secure=true 與 httponly=true**。SameSite 屬性(PHP 7.3+ 支援 setcookie() 第 7 參數或透過 header() 手動設定)防禦 CSRF。| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| setcookie() 回傳 false | 函數呼叫前已有輸出(echo、空白、BOM) | 確保腳本最開頭呼叫,或啟用 output_buffering |
| 跨子網域無法讀取 | domain 參數未正確設定 | 設定 domain=.example.com 並確認 path 為 / |
| HTTPS 頁面 Cookie 遺失 | secure 參數設為 true 但頁面為 HTTP | 僅在 HTTPS 環境啟用 secure,或區分環境設定 |
| JavaScript 讀不到 Cookie | httponly 設為 true | 若前端確實需要存取,設為 false 並評估 XSS 風險 |
Cookie 基礎用法不難,關鍵在於精準掌握 path 路徑與 domain 網域設定,並根據安全需求啟用 secure、httponly、SameSite 等屬性。建議將 Cookie 相關邏輯封裝為工具類,統一管理專案中的 Cookie 策略,減少人為錯誤。