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

PHP 利用隱藏表單字段傳遞上一頁 URL 實現返回導航

     編輯:PHP 相關知識

多步驟表單(如:列表 → 新增 → 確認 → 完成)需在最後一步「返回列表」時跳轉回原始列表頁。由於 HTTP 無狀態、HTTP_REFERER 不可靠(可能被代理/防火牆剝離、用戶直接訪問),最穩健方案是**在首個表單頁將原始 URL 寫入隱藏字段,層層透傳**。

核心模式:首頁植入 → 中間透傳 → 終頁使用

步驟 1:列表頁生成帶返回 URL 的新增鏈接

<?php
// list.php
$returnUrl = urlencode('https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
// 或手動構建:$returnUrl = urlencode('/admin/users?page=3&status=active');
?>
新增用戶

步驟 2:新增表單頁植入隱藏字段

<?php
// create.php
$return = $_GET['return'] ?? '/admin/users'; // 默認回退
$return = urldecode($return); // 還原
?>

步驟 3:確認頁再次透傳

<?php
// confirm.php
$return = $_POST['return_url'] ?? '/admin/users';
?>

用戶名:

郵箱:

取消返回

步驟 4:處理頁執行業務後跳轉

<?php
// store.php
$return = $_POST['return_url'] ?? '/admin/users';

// 業務邏輯:驗證、入庫...
$success = User::create($_POST);

if ($success) {
    // 成功:跳轉回原始列表頁
    header("Location: $return");
    exit;
} else {
    // 失敗:返回確認頁並保留 return_url
    header("Location: confirm.php?return_url=" . urlencode($return));
    exit;
}
?>

進階:封裝為輔助函數

<?php
/** 生成帶返回 URL 的表單隱藏字段 HTML */
function return_url_field(string $name = 'return_url', ?string $default = null): string {
    $url = $_POST[$name] ?? $_GET[$name] ?? $default ?? '/';
    return '';
}

/** 獲取返回 URL,優先 POST > GET > 默認 */
function get_return_url(string $name = 'return_url', string $default = '/'): string {
    return $_POST[$name] ?? $_GET[$name] ?? $default;
}

/** 安全跳轉:驗證 URL 同域、非危險協議 */
function safe_redirect(string $url, string $fallback = '/'): void {
    $parsed = parse_url($url);
    if (!$parsed || !isset($parsed['host'])) {
        $url = $fallback;
    } elseif ($parsed['host'] !== $_SERVER['HTTP_HOST']) {
        $url = $fallback; // 防開放重定向攻擊
    }
    header("Location: $url");
    exit;
}

// 使用示例
$return = get_return_url();
safe_redirect($return);

為何不用 $_SERVER['HTTP_REFERER']?

場景HTTP_REFERER 表現隱藏字段方案
用戶從收藏夾/地址欄直接進入空有默認回退
HTTPS → HTTP 跨協議瀏覽器不發送正常透傳
企業代理/殺毒軟體剝離丟失正常透傳
中間頁面刷新/F5變為中間頁 URL保持原始 URL
開放重定向攻擊風險高(直接信任)可在 safe_redirect 中驗證同域

應用場景擴展

  • 多步驟向導:註冊 → 驗證郵箱 → 完善資料 → 完成,全程保持返回入口。
  • 編輯頁取消按鈕:直接 <a href=">取消</a>。
  • AJAX 提交:隱藏字段放在 FormData 中,成功回調 window.location = returnUrl。
  • 權限不足攔截:登錄頁植入 return_url,登錄成功跳回原受保護頁面。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved