Cookie 受同源策略限制,僅屬於設定它的網域。當網站擁有多個網域(如 domain1.com、domain2.com),使用者在其中一個網域登入後,無法自動在其他網域保持登入狀態。傳統解法需在每個網域分別登入,體驗極差。
sessionid,覆寫 Cookiemod_rewrite 將特殊格式 URL 重寫為標準查詢字串在所有 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/
為每個虛擬主機加入:
<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 重寫行為。
HttpOnly、Secure、SameSite=Lax 屬性若專案允許重構,建議採用: