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

跨域名 Cookie 共享解決方案:PHP + Apache Rewrite 實作

     編輯:PHP 相關知識

問題背景

Cookie 受同源策略限制,僅屬於設定它的網域。當網站擁有多個網域(如 domain1.com、domain2.com),使用者在其中一個網域登入後,無法自動在其他網域保持登入狀態。傳統解法需在每個網域分別登入,體驗極差。

核心思路:Session ID 跨域傳遞 + URL Rewrite

  1. 前置腳本優先讀取 GET 參數 sessionid,覆寫 Cookie
  2. 跨域連結自動附加 Session ID 參數
  3. Apache mod_rewrite 將特殊格式 URL 重寫為標準查詢字串

步驟一:前置腳本處理 Session ID

在所有 PHP 檔案最前端引入(或設為 auto_prepend_file):

<?php
// cross_domain_session.php
if (isset($_GET['sessionid']) && (!isset($_COOKIE['sessionid']) || $_COOKIE['sessionid'] !== $_GET['sessionid'])) {
    setcookie('sessionid', $_GET['sessionid'], 0, '/');
    $_COOKIE['sessionid'] = $_GET['sessionid'];
}
$sessionid = $_COOKIE['sessionid'] ?? $_GET['sessionid'] ?? '';
?>

步驟二:統一管理跨域連結變數

建立共用設定檔 domains.php:

<?php
$domains = [
    'domain1' => "https://www.domain1.com/-{$sessionid}-",
    'domain2' => "https://www.domain2.com/-{$sessionid}-",
];

頁面產生跨域連結時:

<a href="<?php echo $domains['domain2']; ?>contact/">聯繫我們</a>

輸出範例:https://www.domain2.com/-abc123-/contact/

步驟三:Apache Rewrite 規則

為每個虛擬主機加入:

<VirtualHost *:80>
  ServerName www.domain1.com
  DocumentRoot /var/www/domain1
  RewriteEngine On
  # 處理帶參數情況:/-sessionid-/path/?foo=bar → /path/?foo=bar&sessionid=sessionid
  RewriteRule ^/-(.*)-(.*\?.*)$ $2&sessionid=$1 [L,R,QSA]
  # 處理無參數情況:/-sessionid-/path/ → /path/?sessionid=sessionid
  RewriteRule ^/-(.*)-(.*)$ $2?sessionid=$1 [L,R,QSA]
</VirtualHost>

同樣設定套用至 www.domain2.com 等其他網域。

運作流程圖解

用戶在 domain1.com 登入 → 取得 sessionid=abc123
點擊 domain2.com 連結 → https://domain2.com/-abc123-/contact/
Apache Rewrite → https://domain2.com/contact/?sessionid=abc123
PHP 前置腳本讀取 GET sessionid → 寫入 Cookie → 驗證成功 → 自動登入

優缺點分析

優點缺點
無需修改網域內部連結URL 暫時暴露 Session ID(建議啟用 HTTPS)
實作簡單,相容舊系統無法一次登出所有網域的 Cookie
不依賴第三方服務需維護 Apache Rewrite 規則

實際案例參考

可參觀 familyhealth.com.au 滑鼠懸停跨域連結觀察 URL 重寫行為。

安全性建議

  • 全站強制 HTTPS,防止 Session ID 傳輸中被竊聽
  • Session ID 使用高熵亂數,並設定 HttpOnly、Secure、SameSite=Lax 屬性
  • 定期輪換 Session ID,限制存活時間

現代替代方案

若專案允許重構,建議採用:

  • JWT (JSON Web Token):無狀態認證,攜帶於 Authorization Header
  • OAuth 2.0 / OpenID Connect:標準化授權框架,支援單點登入 (SSO)
  • 共享 Session 儲存:Redis/Memcached 集中儲存,各節點讀取同一 Session
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved