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

PHP header() 實現定時跳轉:refresh 參數用法與編碼陷阱完整指南

     編輯:PHP 綜合知識

前言

PHP header() 配合 refresh 參數可輕鬆實現「N 秒後自動跳轉」,無需 JavaScript。本文說明語法、等效 HTML meta 標籤、UTF-8 BOM 陷阱、以及進階應用場景。

基本語法與範例

<?php
// 3 秒後跳轉至指定網址
header('refresh:3;url=https://www.example.com');
echo '正在載入,請稍候...<br>3 秒後自動跳轉';
?>

瀏覽器接收到的 HTTP 標頭:

Refresh: 3; url=https://www.example.com

等效 HTML meta 標籤 (置於 <head>):

<meta http-equiv="refresh" content="3; url=https://www.example.com">

參數格式詳解

refresh: <秒數>; url=<目標網址>

關鍵陷阱:UTF-8 BOM 導致 header 失效

現象:程式碼正確但跳轉不執行,瀏覽器直接顯示文字。

原因:PHP 檔案儲存為 **UTF-8 with BOM** (EF BB BF),這三個位元組在 header() 前被輸出,導致「標頭已送出」錯誤。

解決:

  1. 編輯器 (VS Code、Notepad++, PhpStorm) 另存為 **UTF-8 無 BOM**。
  2. 或在程式最開頭加入 ob_start() 開啟輸出緩衝 (治標不治本)。
  3. 檢查 include/require 的檔案是否含 BOM/空白/換行。
  4. 進階應用場景

    1. 表單送出成功 → 3 秒跳回列表

    <?php
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        // 處理表單...
        $success = saveData($_POST);
        if ($success) {
            header('refresh:3;url=list.php');
            echo '儲存成功!3 秒後返回列表頁...';
            exit;
        }
    }
    ?>

    2. 錯誤頁面 → 5 秒跳回首頁

    <?php
    http_response_code(404);
    header('refresh:5;url=/');
    echo '404 - 頁面不存在<br>5 秒後自動返回首頁...';
    ?>

    3. 條件式跳轉:登入檢查

    <?php
    session_start();
    if (!isset($_SESSION['user_id'])) {
        header('refresh:2;url=login.php?redirect=' . urlencode($_SERVER['REQUEST_URI']));
        echo '請先登入,2 秒後導向登入頁...';
        exit;
    }
    ?>

    4. 配合 ob_start() 避免輸出衝突

    <?php
    ob_start();  // 開啟緩衝,允許在輸出 HTML 後再送 header
    // ... 大量 HTML 輸出 ...
    if ($needRedirect) {
        header('refresh:3;url=target.php');
        // 此時 header 仍能正常送出,因為輸出在緩衝區
    }
    ob_end_flush();
    ?>

    比較:header refresh vs JavaScript 跳轉

參數說明範例
秒數整數,0 表立即跳轉0, 3, 5
url完整 URL (含協議) 或相對路徑https://example.com, /login.php
分隔符分號 ; + 空白 (可選)refresh:3;url=...

最佳實務建議

  • 永久轉址:請用 header('Location: ...', true, 301) 或 302,非 refresh。
  • 編碼檢查:專案統一 UTF-8 無 BOM,CI/CD 加入檢查腳本。
  • 使用者體驗:顯示倒數秒數請改用 JS;單純延遲跳轉用 header refresh 最簡潔。
  • 測試工具:curl -I 檢查 Refresh 標頭是否正確送出。

結語

header('refresh:N;url=...') 是 PHP 實現延遲跳轉最輕量的方式,核心注意點只有一個:**確保 PHP 檔案為 UTF-8 無 BOM,且在任何輸出前呼叫**。掌握此原則,即可在表單送出、錯誤頁、權限攔截等場景靈活運用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性header refreshJavaScript (setTimeout)
支援無 JS 環境✅ 是❌ 否
可攜帶 POST 資料❌ 否 (僅 GET)✅ 可用 form.submit()
SEO 友善⚠️ 視為轉址,權重傳遞較弱❌ 機器人通常不執行 JS
可倒數顯示秒數❌ 需 JS 配合✅ 原生支援
實作複雜度極低低