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

PHP 登入後自動跳回原頁面:利用 $_SERVER['REQUEST_URI'] 實現最佳用戶體驗

     編輯:PHP 綜合知識

場景痛點

用戶 A 分享商品連結給 B,B 點開未登入 → 導向登入頁 → 登入成功 → **跳回首頁**(而非商品頁)。體驗極差,轉化率直線下降。

核心解法:Session 記錄原始請求 URI

1. 攔截器:檢查登入狀態並記錄目標頁

<?php
// check_login.php - 所有需登入頁面頂部 require
session_start();

if (!isset($_SESSION['login_ok'])) {
    // 記錄完整請求 URI(含查詢字串)
    $_SESSION['redirect_url'] = $_SERVER['REQUEST_URI'];

    // 彈窗提示並跳轉登入頁
    echo '<script>';
    echo 'alert("請先登入才能訪問該頁面");';
    echo 'location.href = "/login.php";';
    echo '</script>';
    exit;
}
?>

2. 登入處理:驗證成功後讀取並跳轉

<?php
// login.php
session_start();

// ... 此處執行帳密驗證、驗證碼、OAuth 等邏輯 ...
$loginSuccess = true; // 假設驗證通過

if ($loginSuccess) {
    $_SESSION['login_ok'] = true;
    $_SESSION['user_id']  = $userId;

    // 取得原始目標頁,無則預設首頁
    $targetUrl = $_SESSION['redirect_url'] ?? '/index.php';
    unset($_SESSION['redirect_url']); // 用完即刪,避免殘留

    // 安全過濾:防止開放重定向攻擊
    if (!preg_match('#^(/|https?://' . preg_quote($_SERVER['HTTP_HOST'], '#') . ')#', $targetUrl)) {
        $targetUrl = '/index.php';
    }

    // 方式一:Meta Refresh(兼容性最好)
    echo "<meta http-equiv=\"refresh\" content=\"0.5;url=$targetUrl\">";
    echo "<script>location.href = '$targetUrl';</script>"; // 雙重保障
    exit;
}
?>

關鍵安全加固

風險對策
開放重定向白名單驗證 $targetUrl 僅允許相對路徑或同域絕對路徑
Session Fixation登入成功後 session_regenerate_id(true)
CSRF登入表單加入 csrf_token 驗證
敏感頁面殘留登出時清除 redirect_url,避免登出後誤導

進階:AJAX 登入 + SPA 路由

<?php
// API 端點:/api/login
header('Content-Type: application/json');

session_start();
// ... 驗證邏輯 ...
if ($success) {
    $_SESSION['login_ok'] = true;
    $target = $_SESSION['redirect_url'] ?? '/';
    unset($_SESSION['redirect_url']);
    echo json_encode(['code' => 0, 'redirect' => $target]);
    exit;
}
echo json_encode(['code' => 401, 'msg' => '帳號或密碼錯誤']);
?>

前端收到 redirect 直接 router.push() 或 location.href,無刷新跳轉。

替代方案對比

方案優點缺點適用場景
Session 記錄 URI簡單、可靠、支援完整查詢字串需 Session、多標籤頁可能互相干擾傳統多頁應用(MPA)
Hidden Input 傳遞 redirect無 Session 依賴、多標籤隔離需修改所有登入連結帶參數無 Session 環境、靜態站點
Referer Header零代碼侵入不可靠(可偽造、隱私模式無 Referer)輔助備選,不可作主流
JWT 携帶 redirect claim無狀態、跨域支援Token 體積大、需簽名驗證微服務、SSO、前後端分離

最佳實踐清單

  • 所有需登入頁面統一 require 'check_login.php'
  • 登入頁表單 action 指向處理邏輯,而非自身
  • 登入成功後 立即刪除 redirect_url
  • 配合 session_regenerate_id() 防 Session Fixation
  • 記錄登入日誌含 redirect_from 供分析
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved