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

PHP Cookie 跨二級域名共享完整指南:setcookie 參數詳解與封裝類

     編輯:PHP 相關知識

問題背景

主域名 `hzhuti.com` 下有多個二級域名(`www.hzhuti.com`、`bbs.hzhuti.com`、`blog.hzhuti.com`),需實現 Cookie 在所有子域名間共享讀寫。

setcookie() domain 參數的正確設定

設定值效果備註
`*.hzhuti.com`❌ 失效通配符 `*` 不被標準支援
`.hzhuti.com`✅ 成功標準寫法,前綴點表示包含所有子域名
`hzhuti.com`✅ 成功現代瀏覽器同樣視為包含子域名(RFC 6265)
`ss.hzhuti.com`⚠️ 僅限該子域名不共享給其他子域名

推薦寫法

// 共享給所有子域名,路徑為根目錄,有效期 12 小時
setcookie("hzhuti", $value, time() + 3600*12, '/', '.hzhuti.com');
  • path: '/' 確保全站路徑可讀。
  • domain: '.hzhuti.com' 明確宣告共享範圍,相容性最佳。
  • 若需 HTTPS 專用,加上 `secure: true`;若需防 XSS,加上 `httponly: true`(PHP 5.2+ 支援第 7 參數)。

跨伺服器部署注意事項

  • 不同伺服器需確保 **時間同步**(NTP),否則 Cookie 過期判斷會出現偏差。
  • 所有節點需使用 **相同的加密金鑰**(如 `session.cookie_secure`、`session.cookie_httponly` 等設定一致)。
  • 若使用 Session,需配置共享 Session 儲存(Redis、Memcached、資料庫)。

PHP Cookie 封裝類(支援陣列值、自動序列化)

<?php
/**
 * PHP Cookie 操作類
 * 支援多值儲存(內部序列化)、自動處理 magic_quotes、過期時間設定
 */
class PHP_COOKIE {
    private $_name = '';
    private $_val = [];
    private $_expires;
    private $_path = '/';
    private $_domain = '';

    public function __construct($cname, $cexpires = '', $cpath = '/', $cdomain = '') {
        $this->_name = $cname;
        $this->_expires = $cexpires ? $cexpires : time() + 60*60*24*30*12; // 預設 1 年
        $this->_path = $cpath;
        $this->_domain = $cdomain;
        $this->_val = [];
        $this->extract();
    }

    private function extract($cname = '') {
        if (!isset($_COOKIE)) {
            global $_COOKIE;
            $_COOKIE = $GLOBALS["HTTP_COOKIE_VARS"] ?? [];
        }
        $cname = $cname ?: $this->_name;
        if (!empty($_COOKIE[$cname])) {
            $val = $_COOKIE[$cname];
            if (get_magic_quotes_gpc()) $val = stripslashes($val);
            $arr = @unserialize($val);
            if ($arr !== false && is_array($arr)) {
                foreach ($arr as $k => $v) {
                    $_COOKIE[$k] = $v;
                    $GLOBALS[$k] = $v;
                }
                $this->_val = $arr;
            }
        }
        unset($_COOKIE[$cname], $GLOBALS[$cname]);
    }

    public function put($var, $value) {
        $_COOKIE[$var] = $value;
        $this->_val[$var] = $value;
        $GLOBALS[$var] = $value;
        if (empty($value)) unset($this->_val[$var]);
    }

    public function get($var) {
        return $this->_val[$var] ?? null;
    }

    public function clear() {
        $this->_val = [];
    }

    public function set() {
        $cookie_val = empty($this->_val) ? '' : serialize($this->_val);
        if (strlen($cookie_val) > 4096) {
            trigger_error("Cookie {$this->_name} exceeds 4KB limit", E_USER_WARNING);
        }
        setcookie($this->_name, $cookie_val, $this->_expires, $this->_path, $this->_domain);
    }
}

使用範例

$cookie = new PHP_COOKIE('user_data', time()+3600, '/', '.hzhuti.com');
$cookie->put('uid', 12345);
$cookie->put('name', 'John Doe');
$cookie->set(); // 寫入瀏覽器

// 讀取
$cookie2 = new PHP_COOKIE('user_data');
echo $cookie2->get('uid'); // 12345
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved