在舊版 IE(IE6/7/8/9)中,使用 JavaScript window.open() 或 target="_blank" 開啟新視窗時,常會發生 Session 遺失、使用者登入狀態消失的問題。經實測分析,根本原因在於 PHP 預設的 Session ID 儲存於「進程級」Cookie(即瀏覽器進程關閉即失效),而舊版 IE 開啟新視窗會啟動獨立進程,導致原視窗的 Session Cookie 無法傳遞至新進程。
PHP session_start() 預設產生的 PHPSESSID Cookie 未設定 expire 參數,屬於「會話級 Cookie」(Session Cookie),僅在當前瀏覽器進程有效。舊版 IE 的 window.open 與 target="_blank" 會建立新進程,新進程無法讀取父進程的會話級 Cookie,導致 Session ID 遺失,伺服器無法識別使用者身分。
在 session_start() 前手動設定帶有過期時間的 Cookie,使 Session ID 跨進程保持有效:
<?php // 設定 Session ID 為持久性 Cookie(例如 30 天有效) $lifetime = 30 * 24 * 3600; // 30 天 session_set_cookie_params($lifetime, '/', '', false, true); // 最後參數為 HttpOnly session_start(); // 也可直接用 setcookie 覆寫 PHPSESSID setcookie(session_name(), session_id(), time() + $lifetime, '/', '', false, true); ?>
PHP 設定 session.use_trans_sid = 1 可自動將 Session ID 附加到 URL,但僅支援絕對路徑,相對路徑不會自動加入,且會暴露 Session ID 於 URL 中,安全性較低,不建議作為主要方案。
HttpOnly、Secure 標記)此問題在現代瀏覽器(IE10+、Chrome、Firefox、Edge)已不存在,若專案仍需支援舊版 IE,請務必在專案初始化階段統一設定 Session Cookie 參數。