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

PHP 網頁重新導向三大方法:Header、JavaScript、Meta Refresh 完整比較

     編輯:PHP 相關知識

前言

PHP 重新導向 (Redirect) 是表單提交後、登入驗證後、權限不足時常用操作。本文詳細比較三種方法的原理、適用場景、優缺點與最佳實踐。

方法 1:HTTP Header Location (標準、推薦)

<?php
$target = 'success.php'; // 可來自資料庫動態決定
header('Location: ' . $target);
exit; // 關鍵:阻止後續代碼執行
?>
  • 優點:HTTP 302 標準重導向、瀏覽器歷史紀錄乾淨、無 JS 依賴、搜尋引擎友善。
  • 缺點:必須在**任何輸出前**呼叫 (含空白、BOM、echo),否則「Headers already sent」錯誤。
  • 適用:所有伺服端重導向首選。

方法 2:JavaScript window.location (輸出後補救)

<?php
echo '<script>window.location.href = "success.php";</script>';
// 或
echo '<script>window.location.replace("success.php");</script>'; // 不留歷史紀錄
?>
  • 優點:可在**輸出 HTML 後**執行,彈性高。
  • 缺點:需瀏覽器支援 JS、留下歷史紀錄 (除非用 `replace`)、搜尋引擎可能不跟隨、使用者可禁用 JS 導致失效。
  • 適用:Header 已送出無法使用時的備援、AJAX 回應中重導向、需延遲/倒數計時重導向。

方法 3:HTML Meta Refresh (靜態頁/極舊環境)

<?php
echo '<meta http-equiv="refresh" content="0; url=success.php">';
// content="秒數; url=目標",0 秒即時跳轉
?>
  • 優點:純 HTML、無 JS/HTTP Header 依賴、極舊瀏覽器相容。
  • 缺點:W3C 不建議使用 (可用性、SEO 問題)、延遲不可控、歷史紀錄行為不一、部分瀏覽器攔截。
  • 適用:靜態 HTML 頁面、極舊環境、維護頁面倒數跳轉。

比較總結表

維度Header LocationJavaScriptMeta Refresh
HTTP 狀態碼302 (預設) / 301200 + JS 執行200 + Meta
執行時機Header 階段 (輸出前)DOM 載入後HTML 解析時
瀏覽器歷史不留 (302) / 留 (301)留 (`href`) / 不留 (`replace`)留
SEO 友善最佳一般差
相依性無需 JS 啟用無
彈性低 (需輸出前)高 (可延遲、條件判斷)低

最佳實踐模板

<?php
function redirect(string $url, int $statusCode = 302): never {
    // 1. 確保無輸出
    if (headers_sent($file, $line)) {
        // 備援:JS 重導向
        echo '<script>window.location.replace(' . json_encode($url) . ');</script>';
        exit;
    }

    // 2. 發送標準 Header
    http_response_code($statusCode);
    header('Location: ' . $url);
    exit;
}

// 使用
if ($loginSuccess) {
    redirect('dashboard.php');
} elseif ($permissionDenied) {
    redirect('403.php', 403);
}

常見陷阱與解決

  • Headers already sent:檢查檔案開頭無 BOM、無空白、無 `echo`/`print`/`var_dump`、`include` 檔案無結尾空白。
  • 重導向循環:邏輯錯誤導致 A→B→A,瀏覽器會報錯「Too many redirects」。
  • 相對路徑問題:建議使用絕對 URL (`https://example.com/path`) 或以 `/` 開頭的絕對路徑。
  • 狀態碼選擇:永久移動用 301 (SEO 傳遞權重)、暫時移動用 302/303/307 (POST 重導向用 303)。

總結

**Header Location 是標準首選**,JavaScript 為輸出後備援,Meta Refresh 僅作極舊環境相容。封裝 `redirect()` 函式統一處理狀態碼、備援邏輯與輸出檢查,能避免 99% 重導向相關 Bug。

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