Cookie 是伺服器發送至瀏覽器的小型文字資料,瀏覽器會在後續請求中自動攜帶。PHP 透過 setcookie() 發送 Set-Cookie HTTP 標頭,**必須在任何輸出之前呼叫**(含空白、BOM、HTML)。
setcookie(string $name, string $value = "", int $expires_or_options = 0, string $path = "", string $domain = "", bool $secure = false, bool $httponly = false): bool
PHP 7.3+ 支援陣列選項寫法:
setcookie(string $name, string $value = "", array $options = []): bool
| 參數 | 說明 |
|---|---|
name | Cookie 名稱(必填),自動建立同名變數 $_COOKIE['name'] |
value | Cookie 值,自動 URL 編碼/解碼 |
expires_or_options | 過期時間(Unix 時間戳),0=瀏覽器關閉失效;或選項陣列 |
path | 生效路徑,/ 為全域,/admin/ 僅限該目錄 |
domain | 生效網域,.example.com 包含所有子網域 |
secure | true 僅 HTTPS 傳輸 |
httponly | true 禁止 JavaScript 存取(防 XSS) |
<?php
setcookie('user_pref', 'dark_mode', [
'expires' => time() + 86400 * 30, // 30 天
'path' => '/',
'domain' => '.example.com',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax', // CSRF 防護:Lax/Strict/None
]);
?>
<?php
setcookie("TestCookie", "my cookie value");
?>
<?php
setcookie("TestCookie", "my cookie value", time() + 3600 * 24);
?>
<?php
// 設定過期時間為過去
setcookie("TestCookie", "", time() - 3600);
// 或 PHP 7.3+
setcookie("TestCookie", "", ['expires' => time() - 3600]);
?>
<?php
// 當前請求無法立即讀取剛設定的 Cookie,需下一次請求
if (isset($_COOKIE['TestCookie'])) {
echo $_COOKIE['TestCookie'];
}
?>
Lax 兼顧安全與體驗,Strict 最嚴格,None 需配合 secure。path、domain 僅設必要範圍。ob_start() 緩衝輸出。domain=.example.com(前綴點號)。path、domain、secure、httponly 與設定時完全一致。Cookie 是 HTTP 無狀態特性的關鍵補充,正確設定與安全配置是 Web 開發必備功力。