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

PHP 頁面重導向完整指南:header()、輸出緩衝與封裝最佳實踐

     編輯:PHP 綜合知識

重導向核心機制

PHP 透過 header() 函數發送 HTTP 標頭指令瀏覽器執行導向。兩種主要模式:立即導向(302 Found)與延遲導向(Refresh 標頭)。

立即導向:Location 標頭

header('Location: https://example.com/target.php');
// 關鍵:必須立即終止腳本執行
die(); // 或 exit();

// 完整範例
if (!isset($_SESSION['user_id'])) {
    header('Location: /login.php?redirect=' . urlencode($_SERVER['REQUEST_URI']));
    die();
}

⚠️ 關鍵限制:輸出前送出

header() 必須在任何輸出之前呼叫(包含空白、BOM、echo、HTML 標籤)。否則觸發「Headers already sent」警告並導向失敗。

解決方案:輸出緩衝

// 方法 1:腳本開頭啟用
ob_start();
// ... 任意輸出操作 ...
header('Location: /target.php');
ob_end_flush(); // 釋放緩衝並發送

// 方法 2:php.ini 設定(全域生效)
// output_buffering = 4096

延遲導向:Refresh 標頭

適用於顯示提示訊息、倒數計時等情境:

header('Refresh: 3; url=/dashboard.php');
echo '登入成功,3 秒後跳轉...';
die();

HTML 替代方案(無輸出限制):


登入成功,3 秒後跳轉...

封裝通用導向函數

/**
 * 統一導向函數
 * 
 * @param string $url      目標 URL
 * @param string|null $msg 提示訊息(null 為立即導向)
 * @param int $seconds     延遲秒數(僅 $msg 非 null 時生效)
 */
function redirect(string $url, ?string $msg = null, int $seconds = 3): never {
    if ($msg === null) {
        header("Location: {$url}");
    } else {
        // 使用 HTML meta 導向,支援自訂樣式
        header("Content-Type: text/html; charset=utf-8");
        echo <<


頁面跳轉中...


{$msg}

{$seconds} 秒後自動跳轉... 點此手動跳轉

HTML; } exit; // never 回傳型別(PHP 8.1+) }

進階應用場景

場景實作要點
登入後返回原頁儲存 $_SERVER['REQUEST_URI'] 到 Session,登入成功後讀取導向
POST-Redirect-GET (PRG) 模式表單提交處理完畢導向 GET 頁面,防止重複提交
多語系導向根據 Accept-Language 或 Session 語系偏好導向對應語言頁面
維護模式中介層檢查維護旗標,非管理員導向維護頁面

HTTP 狀態碼選擇指南

  • 301 Moved Permanently:永久遷移(SEO 權重轉移)
  • 302 Found (預設):暫時導向
  • 303 See Other:PRG 模式推薦,強制 GET 請求
  • 307 Temporary Redirect:保持原請求方法
  • 308 Permanent Redirect:永久且保持方法
header('Location: /new-url.php', true, 301); // 明確指定 301
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved