在 PHP 開發中,常需在處理完邏輯後延遲導向其他頁面(如付款成功倒數跳轉)。本文整理三種主流跳轉方式,並說明各自的適用場景與注意事項。
最標準的伺服器端跳轉方式,必須在任何輸出之前呼叫。
<?php
// 3 秒後跳轉至指定網址
header("refresh:3;url=https://example.com");
echo '正在載入,請稍候...<br>三秒後自動跳轉~';
?>
優點: 純伺服器端控制,無需瀏覽器支援 JavaScript。
缺點: 若前方已有輸出(含 BOM、空白字元),會觸發 Headers already sent 錯誤。
在頁面 <head> 區塊輸出 meta 標籤,瀏覽器解析後自動跳轉。
<?php $url = 'https://example.com'; ?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="refresh" content="10; url=<?php echo $url; ?>">
</head>
<body>10 秒後自動跳轉...</body>
</html>
優點: 不受 PHP 輸出限制,可置於頁面任意位置。
缺點: 會被部分瀏覽器攔截或使用者停用,SEO 不友善(搜尋引擎可能視為軟性跳轉)。
輸出 JS 程式碼操作 window.location,彈性最高。
<?php $url = 'https://example.com'; ?>
<script>
// 立即跳轉
// window.location.href = '';
// 延遲 3 秒跳轉
setTimeout(function() {
window.location.href = '';
}, 3000);
</script>
優點: 可結合倒數計時、動畫、條件判斷等豐富互動。
缺點: 依賴用戶端啟用 JS,若被封鎖則失效。
header('Location: ...') 的相對路徑是相對執行腳本的 URL,而非 include 檔案所在目錄。範例:
// include/test.php
header('Location: index.php'); // 相對 test.php 所在目錄
// another/test2.php
include '../include/test.php'; // 此時執行腳本為 test2.php
// 實際跳轉會指向 another/index.php
建議: 永遠使用絕對路徑或以網站根目錄為基準(/index.php)。
| 場景 | 推薦方式 | 備註 |
|---|---|---|
| 表單提交後處理完成導向 | Header (302/303) | 確保無輸出,搭配 exit() |
| 靜態頁面延遲跳轉 | Meta Refresh | 簡單、無 JS 依賴 |
| 需倒數計時、動畫、條件判斷 | JavaScript | 體驗最佳,需容錯處理 |
| AJAX 回應導向 | JSON 回傳 URL + 前端 JS | 分離關注點 |
理解三種跳轉機制的差異,能根據業務需求選擇最適合的方案。現代專案建議採用「後端回傳跳轉目標,前端決定跳轉方式」的架構,兼顧安全性與使用者體驗。