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

PHP 頁面跳轉實作完全指南:Header、Meta、JavaScript 三大方案

     編輯:PHP 相關知識

前言

頁面跳轉是 Web 開發基礎操作,PHP 提供多種實作方式,各有適用場景與注意事項。本文系統整理三大主流方案,並提供可直接落地的程式碼範本與最佳實踐。

方案一:PHP Header 重導向(伺服器端,推薦)

基本語法

<?php
// 302 暫時重導向(預設)
header('Location: https://example.com/target.php');
exit; // 關鍵:防止後續程式碼繼續執行

// 301 永久重導向(SEO 傳遞權重)
header('HTTP/1.1 301 Moved Permanently');
header('Location: https://example.com/new-url');
exit;?>

多網域分流範例

<?php
$host = $_SERVER['HTTP_HOST'] ?? '';

$routes = [
    'www.a.com' => '/a/index.php',
    'www.b.com' => '/b/index.php',
    'www.c.com' => '/c/index.php',
];

if (isset($routes[$host])) {
    header('Location: ' . $routes[$host], true, 302);
    exit;
}

// 預設處理
header('Location: /default.php');
exit;?>

關鍵注意事項

  • 必須在任何輸出前呼叫:包含空白字元、HTML、echo、print、var_dump、BOM 標記等
  • Location 值建議使用絕對 URL:雖然 RFC 7231 允許相對路徑,但絕對 URL 相容性最佳
  • 一定要加 exit 或 die():否則腳本繼續執行,可能導致資料庫寫入、Session 變更等副作用
  • 狀態碼預設 302:若需 SEO 傳遞權重,明確送出 301
  • 輸出緩衝救援:若無法控制前置輸出,可在腳本最開頭加 ob_start(),並在重導向前 ob_end_clean()

方案二:HTML Meta Refresh(客戶端,無需控制輸出順序)

<?php
$url = 'https://example.com/target.php';
$delay = 3; // 秒
?>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="refresh" content="<?= $delay ?>;url=<?= htmlspecialchars($url, ENT_QUOTES, 'UTF-8') ?>">
    <title>頁面跳轉中...</title>
</head>
<body>
    <p><?= $delay ?> 秒後自動跳轉至 <a href="<?= htmlspecialchars($url, ENT_QUOTES, 'UTF-8') ?>">目標頁面</a></p>
</body>
</html>

適用場景

  • 已有 HTML 輸出無法使用 header()
  • 需顯示倒數計時或轉場提示訊息
  • 靜態頁面或模板引擎渲染後才決定跳轉

缺點

  • 瀏覽器歷史記錄會保留中介頁,使用者按「上一頁」會回到跳轉頁再次觸發
  • 部分舊版瀏覽器/爬蟲不支援
  • SEO 不傳遞權重

方案三:JavaScript 跳轉(客戶端,彈性最高)

<?php
$url = 'https://example.com/target.php';
?>
<script>
// 立即跳轉(取代當前歷史記錄,避免「上一頁」問題)
window.location.replace('<?= htmlspecialchars($url, ENT_QUOTES, 'UTF-8') ?>');

// 或延遲跳轉
// setTimeout(() => window.location.href = '...', 3000);
</script>
<noscript>
    <meta http-equiv="refresh" content="0;url=<?= htmlspecialchars($url, ENT_QUOTES, 'UTF-8') ?>">
</noscript>

進階:帶參數跳轉

<?php
$target = 'https://example.com/order.php';
$params = [
    'id'     => 12345,
    'action' => 'pay',
    'token'  => bin2hex(random_bytes(16)),
];
$url = $target . '?' . http_build_query($params);
?>
<script>window.location.replace('<?= htmlspecialchars($url, ENT_QUOTES, 'UTF-8') ?>');</script>

方案比較表

維度HeaderMeta RefreshJavaScript
執行端伺服器客戶端客戶端
HTTP 狀態碼301/302/303/307/308200200
SEO 傳遞權重是 (301/308)否否
需在輸出前是否否
可攜帶 POST 資料否 (需 Session/Token)否否 (可用 form.submit())
歷史記錄處理瀏覽器決定保留中介頁可用 replace() 移除
適用場景表單提交後、登入驗證、API 重導、SEO 遷移靜態頁、維護通知、倒數提示AJAX 回調、條件判斷、動態參數、SPA 路由

最佳實踐建議

  1. 預設使用 header() + exit,符合 HTTP 標準、SEO 友善、效能最佳
  2. 封裝為工具函數,統一處理狀態碼、URL 組裝、日誌記錄:
    function redirect(string $url, int $status = 302): never {
        // 可在此記錄存取日誌、驗證 URL 白名單等
        header('Location: ' . $url, true, $status);
        exit;
    }
  3. 避免開放式重導向漏洞:嚴格驗證跳轉目標是否在允許清單中,禁止直接使用 $_GET['redirect'] 未經過濾
  4. AJAX 請求回傳 JSON:勿直接輸出 header('Location: ...'),應回傳 {"redirect": "url"} 由前端處理

總結

掌握三種跳轉方案的差異與適用場景,並遵循「優先 Header、次之 Meta/JS、封裝統一、安全第一」原則,即能在各種業務情境下優雅、安全地實作頁面跳轉。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved