當使用者嘗試存取需權限的頁面時,系統會導向登入頁(login.php)。登入成功後,如何將使用者送回原本想看的頁面?本文介紹兩種主流做法:Cookie 儲存法與 GET 參數傳遞法。
在基類控制器的初始化方法(如 ThinkPHP 的 _initialize())中攔截未授權請求,將當前完整 URL 寫入 Cookie:
$refer = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
Cookie::set('refer', $refer);
登入驗證通過後,讀取 Cookie 並跳轉:
$refer = Cookie::get('refer');
// 可透過 AJAX 回傳 $refer 讓前端跳轉,或直接 header 跳轉
header("Location: $refer");
exit;
優點:URL 不暴露於地址列,適合 POST 表單登入;缺點:依賴 Cookie,若使用者禁用 Cookie 則失效。
跳轉登入頁時攜帶 url 參數:
// 原頁面 openphp.html
// 跳轉至
login.php?url=openphp.html
登入頁接收並保存(可存入 Session 或隱藏表單欄位),驗證成功後跳轉:
$target = $_GET['url'] ?? '/'; // 預設首頁
// 驗證通過後
header("Location: $target");
exit;
優點:不依賴 Cookie,相容性極佳;缺點:URL 可見,需防範開放式重導向攻擊(驗證域名白名單)。
$refer 或 $url 嚴格驗證:僅允許本站域名、相對路徑,拒絕外部連結。sessionStorage.setItem('redirect', location.href),登入成功後由前端路由跳轉。兩種方案各有適用場景:傳統 MVC 專案推薦方案一(集中攔截),單頁應用或簡單專案方案二更輕量。