在 PHP 開發中,頁面重定向是極為常見的需求。無論是用戶登入後跳轉、表單提交後導向,還是錯誤處理頁面轉向,掌握多種重定向手法能讓開發更靈活。本文將系統整理三種主流實現方式,並針對常見陷阱提供最佳實踐建議。
使用 header() 函數發送原始 HTTP 標頭,是伺服器端重定向最標準、效能最佳的方式。瀏覽器收到 3xx 狀態碼與 Location 標頭後,會立即跳轉,不會渲染任何頁面內容。
<?php
$url = 'https://www.example.com';
if (!empty($url)) {
// 明確指定 303 See Other(POST 轉 GET 時建議使用)
header('HTTP/1.1 303 See Other');
// 注意:Location 後需有一個空格
header("Location: $url");
exit; // 必須終止腳本,防止後續代碼輸出干擾
}
?>
Location 值建議使用完整 URL(含協議),雖然現代瀏覽器支援相對路徑,但 RFC 7231 規範要求絕對 URI。header() 必須在任何 HTML、空白字元、echo 之前呼叫,否則會觸發 Headers already sent 警告。在無法使用 header()(如已輸出內容)時,可透過輸出 <meta http-equiv="refresh"> 實現客戶端延遲跳轉。
<?php
$url = 'https://www.example.com';
if (!empty($url)) {
// 0 秒後跳轉;content="延遲秒數;URL=目標網址"
echo '<meta http-equiv="refresh" content="0;URL=' . htmlspecialchars($url) . '">';
}
?>
| 優點 | 缺點 |
|---|---|
| 可在輸出 HTML 後使用 | 屬客戶端跳轉,SEO 不友善(搜尋引擎可能不追蹤) |
| 可設定延遲秒數,顯示過渡提示 | 使用者可察覺閃爍,體驗較差 |
| 不受「Headers already sent」限制 | 舊版瀏覽器可能不支援或行為不一 |
透過輸出 <script> 操作 window.location 或 location.href 達成跳轉,適用於需結合邏輯判斷、AJAX 回調等前端場景。
<?php
$url = 'https://www.example.com';
// 寫法 1:location.href
echo '<script>location.href = "' . addslashes($url) . '";</script>';
// 寫法 2:window.location.replace(不留歷史記錄,無法按「上一頁」返回)
echo '<script>window.location.replace("' . addslashes($url) . '");</script>';
?>
header():效能最好、SEO 友善、語意正確。exit:防止後續代碼繼續執行或輸出干擾標頭。htmlspecialchars() 或 urlencode() 處理,防 XSS。掌握這三種方案與其適用場景,能讓你在不同專案情境下游刃有餘地處理 PHP 重定向需求。