雖然 JavaScript window.location.href 是最常見的跳轉方式,但在某些場景(如 CSP 限制、JS 被禁用、SEO 友善、伺服器端重導向)下,純 HTML/HTTP 方式更適合。本文介紹三種無需 JavaScript 的頁面跳轉實作。
在 <head> 區塊放入 <meta http-equiv="refresh"> 標籤。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>頁面跳轉中...>
<meta http-equiv="refresh" content="3;url=https://example.com/target">
</head>
<body>
<p>3 秒後自動跳轉至目標頁面...</p>
<p>若未自動跳轉,請點擊 <a href="https://example.com/target">這裡</a>。</p>
</body>
</html>
content="3;url=...":3 為延遲秒數,0 表立即跳轉。在任何輸出前呼叫 header() 發送 3xx 狀態碼與 Location 標頭。
<?php
// 立即永久重導向 (301)
header('Location: https://example.com/new-page', true, 301);
exit;
// 或臨時重導向 (302/303/307)
// header('Location: https://example.com/login', true, 302);
// exit;
?>
header() 前絕對不能有任何輸出(包含空白、BOM、HTML、echo、var_dump、錯誤訊息)。301 Moved Permanently:永久遷移,SEO 權重傳遞。302 Found / 303 See Other:臨時重導向,POST 重導向建議用 303。307 Temporary Redirect / 308 Permanent Redirect:保持原請求方法(POST 不變成 GET)。Headers already sent 警告。若必須在已輸出內容後才決定跳轉,可發送 Refresh 標頭(非標準但廣泛支援)。
<?php
// 在已有輸出後仍可發送(但仍建議盡早)
header('Refresh: 5; url=https://example.com/dashboard');
echo '登入成功,5 秒後跳轉儀表板...';
<meta http-equiv="refresh">,但由伺服器端控制延遲秒數與目標 URL。若在模板系統中需於中間邏輯重導向,可採用:
ob_start(),結尾 ob_end_flush(),中間可隨時 header()。index.php),路由分發前決定是否重導向,再載入視圖。{redirect: 'url'},前端 JS 處理跳轉(需 JS 支援)。| 場景 | 推薦方法 | 關鍵點 |
|---|---|---|
| 登入後跳轉、權限攔截、API 重導向 | PHP header() + 3xx | 最早執行、exit() 終止腳本、正確狀態碼 |
| 靜態頁面、維護公告、無 PHP 執行環境 | Meta Refresh | 提供可點擊連結備援、延遲 0-5 秒 |
| 表單提交成功顯示訊息再跳轉 | header('Refresh:...') 或 Meta Refresh | 已有輸出內容、需延遲 |
| SEO 關鍵頁面永久遷移 | header('Location:', true, 301) | 傳遞權重、更新搜尋索引 |
掌握無 JavaScript 跳轉技術,能在 CSP 嚴格、JS 禁用、SEO 敏感、伺服器端流程控制等場景提供穩健解決方案。核心原則:優先使用 HTTP 3xx 重導向,輔以 Meta Refresh 作為備援與特殊場景補充。