Web 開發常需「N 秒後跳轉至指定頁面」。本文整理 HTML、JavaScript、PHP 三大類共 9 種跳轉方式,比較機制、適用場景、優缺點與實作細節,附完整程式碼可直接複製使用。
| 類別 | 方法 | 機制 | 可攜帶參數 | 歷史記錄 | 阻塞頁面 | 適用場景 |
|---|---|---|---|---|---|---|
| HTML | <meta http-equiv="refresh"> |
瀏覽器原生解析 | ✅ URL 參數 | 保留 | 否 | 靜態頁、無 JS 環境、SEO 友善 |
HTTP Header Refresh |
Server 回應標頭 | ✅ | 保留 | 否 | PHP 動態決定跳轉時間/目標 | |
| JavaScript | location.href |
DOM Location API | ✅ 完整 URL | 新增記錄 | 否 | 最通用、支援動態運算 |
location.assign() |
DOM Location API | ✅ | 新增記錄 | 否 | 語意明確、可捕獲錯誤 | |
location.replace() |
DOM Location API | ✅ | 替換當前 (無回上頁) | 否 | 登入後跳轉、防止用戶回上頁 | |
location.reload() |
重新載入當前頁 | ❌ | 保留 | 否 | 表單提交後重新整理 | |
history.go(n) |
歷史堆疊導航 | 相對步數 | 移動指標 | 否 | 返回上一頁、前進 | |
window.open() |
開啟新視窗/分頁 | ✅ | 新視窗獨立 | 否 | 外部連結、不離開當前頁 | |
| PHP | header('Location:') |
HTTP 302/301 重導向 | ✅ URL | 瀏覽器處理 | 是 (腳本終止) | 伺服器端邏輯決定跳轉、登入檢查、API 重導向 |
<head>
<meta http-equiv="refresh" content="3;url=index.php">
</head>
<?php
header("Refresh: 3; url=index.php");
echo "3 秒後自動跳轉...";
?>
<?php
sleep(3); // 延遲 3 秒
header("Location: index.php");
exit; // 必須 exit,防止後續碼執行
?>
<script>
setTimeout(function() {
window.location.href = 'index.php';
}, 3000); // 3000 ms = 3 秒
</script>
<script>
setTimeout(function() {
window.location.assign('index.php');
}, 3000);
</script>
<script>
setTimeout(function() {
window.location.replace('index.php');
}, 3000);
</script>
<script>
// 返回上一頁
setTimeout(function() { window.history.go(-1); }, 3000);
// 前進 2 頁
setTimeout(function() { window.history.go(2); }, 3000);
</script>
<script>
setTimeout(function() {
window.open('index.php', '_blank', 'width=800,height=600');
}, 3000);
</script>
location.href = '...' / location.assign('...'):行為相同,新增歷史記錄,用戶可按「上一頁」返回。location.replace('...'):替換 當前歷史記錄,用戶無法按「上一頁」返回原頁。適合:登入成功跳轉、付款完成頁、錯誤頁重導向。// register.php
header("Location: login.php"); // 1. 瀏覽器收到 302,立即跳轉 login.php
// login.php
sleep(3);
header("Location: index.php"); // 2. 瀏覽器在 register.php 直接等 3 秒跳 index.php,login.php 內容從未顯示!
解決:登入頁改用 Meta Refresh 或 JS 延遲跳轉,或將延遲邏輯移至前端。
<meta http-equiv="refresh">header("Refresh: N; url=...")header("Location: ...") + exitsetTimeout(() => location.href=...)location.replace() 或 PHP header("Location: ...")Headers already sent 錯誤。相關專題:《PHP 基本語法入門教程》、《PHP 網絡編程技巧總結》。