在 Web 開發中,頁面跳轉是極高頻的操作。PHP 提供了服務端與客戶端多種跳轉手段,各有適用場景與注意事項。本文深度解析 header()、HTML Meta、JavaScript 三種方案的原理、代碼示例及避坑指南。
原理:發送 HTTP `Location` 響應頭,瀏覽器收到 302 狀態碼自動跳轉。
<?php
// 正確用法
header('Location: https://example.com/target-page');
exit; // 關鍵:防止後續代碼繼續執行
?>
exit 或 die// 301 永久重定向(SEO 友好)
header('HTTP/1.1 301 Moved Permanently');
header('Location: https://new-domain.com/page');
exit;
// 攜帶參數跳轉
$redirectUrl = 'https://api.example.com/callback?' . http_build_query(['code' => $authCode, 'state' => $state]);
header('Location: ' . $redirectUrl);
exit;
適用場景:需顯示提示信息後再跳轉(如「3秒後自動跳轉」)、無法控制服務端 Header 的靜態頁面。
<?php
$url = 'https://example.com';
$delay = 3; // 秒
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="refresh" content="<?= $delay ?>;url=<?= htmlspecialchars($url) ?>">
<title>頁面跳轉中...</title>
</head>
<body>
<p><?= $delay ?> 秒後自動跳轉至 <a href="<?= htmlspecialchars($url) ?>">目標頁面</a></p>
</body>
</html>
適用場景:AJAX 請求後跳轉、需根據邏輯判斷跳轉目標、單頁應用(SPA)路由切換。
<?php
$url = 'https://example.com/dashboard';
?>
<script>
// 方式一:替換當前歷史記錄(推薦,避免返回循環)
window.location.replace('<?= htmlspecialchars($url, ENT_QUOTES) ?>');
// 方式二:普通跳轉(保留歷史)
// window.location.href = '<?= htmlspecialchars($url, ENT_QUOTES) ?>';
// 方式三:延遲跳轉
// setTimeout(() => window.location.href = '<?= htmlspecialchars($url, ENT_QUOTES) ?>', 2000);
</script>
跳轉 URL **必須**經過 htmlspecialchars($url, ENT_QUOTES) 轉義,防止注入惡意腳本:
// 危險示例:用戶控制 $url = 'javascript:alert(1)';
// 安全寫法:
$safeUrl = htmlspecialchars($url, ENT_QUOTES, 'UTF-8');
echo "<script>window.location.replace('$safeUrl');</script>";
| 場景 | 推薦方案 | 關鍵點 |
|---|---|---|
| 登錄驗證成功/失敗、表單提交後、API 回調 | header() + exit | 302/301、零輸出、絕對 URL |
| 需展示操作結果提示(如「保存成功」) | Meta Refresh 或 JS 延遲 | 可讀性、用戶體驗、提供手動跳轉鏈接 |
| AJAX/ Fetch 請求返回跳轉指令 | JSON 返回 URL,前端 JS 跳轉 | 前後端分離架構標準模式 |
| 靜態頁面/CDN 邊緣節點 | Meta Refresh | 無服務端動態能力 |
**首選 `header()`**:性能最好、語義明確、SEO 友好。**輔以 JS**:滿足前後端分離、動態邏輯跳轉需求。**慎用 Meta**:僅作為無服務端控制權時的降級方案。始終記住:跳轉前**零輸出**、跳轉後**立即退出**、用戶輸入的 URL **必須轉義**。