前言
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=<目標網址>
| 參數 | 說明 | 範例 |
秒數 | 整數,0 表立即跳轉 | 0, 3, 5 |
url | 完整 URL (含協議) 或相對路徑 | https://example.com, /login.php |
| 分隔符 | 分號 ; + 空白 (可選) | refresh:3;url=... |
關鍵陷阱:UTF-8 BOM 導致 header 失效
現象:程式碼正確但跳轉不執行,瀏覽器直接顯示文字。
原因:PHP 檔案儲存為 **UTF-8 with BOM** (EF BB BF),這三個位元組在 header() 前被輸出,導致「標頭已送出」錯誤。
解決:
- 編輯器 (VS Code、Notepad++, PhpStorm) 另存為 **UTF-8 無 BOM**。
- 或在程式最開頭加入
ob_start() 開啟輸出緩衝 (治標不治本)。
- 檢查
include/require 的檔案是否含 BOM/空白/換行。
進階應用場景
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 跳轉
| 特性 | header refresh | JavaScript (setTimeout) |
| 支援無 JS 環境 | ✅ 是 | ❌ 否 |
| 可攜帶 POST 資料 | ❌ 否 (僅 GET) | ✅ 可用 form.submit() |
| SEO 友善 | ⚠️ 視為轉址,權重傳遞較弱 | ❌ 機器人通常不執行 JS |
| 可倒數顯示秒數 | ❌ 需 JS 配合 | ✅ 原生支援 |
| 實作複雜度 | 極低 | 低 |
最佳實務建議
- 永久轉址:請用
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,且在任何輸出前呼叫**。掌握此原則,即可在表單送出、錯誤頁、權限攔截等場景靈活運用。
- 上一篇文章: PHP 結合 JavaScript 實現超連結點擊確認刪除資料完整範例
- 下一篇文章: ThinkPHP 多檔案上傳完整實作:圖片縮圖、視頻上傳、陣列欄位處理
Copyright ©
程式碼之家 All Rights Reserved