HOWTO · PHP
PHP 中的重定向
本教程演示瞭如何將使用者從頁面重定向到 PHP 中的其他頁面
本頁內容
若要在 PHP 中重新導向請求,請在指令碼輸出 HTML 或其他內容之前,使用 header() 傳送 Location 回應標頭,然後停止指令碼。下方範例會將瀏覽器導向指定網址。將 PHP 檔案放在本機網頁伺服器上,再用瀏覽器開啟,即可查看導向結果。
使用 PHP 的 header() 函式重新導向至網址
header() 函式會傳送 HTTP 回應標頭。重新導向時,標頭欄位是 Location,其值為目的地網址。PHP 必須在傳送任何回應本文內容之前傳送此標頭,包括 PHP 標籤外的空白字元。請將重新導向程式碼放在請求處理程序的開頭附近,並置於範本或頁面輸出之前。
這個獨立範例會使用變數存放目的地網址。回應準備好後,exit 呼叫會結束目前的請求,避免頁面其餘部分繼續執行,彷彿重新導向沒有發生。提供的執行檢查已成功執行此範例,且標準輸出為空;重新導向資訊包含在 HTTP 回應中,而不是以文字印出。在瀏覽器中透過本機網頁伺服器開啟 PHP 檔案時,瀏覽器應會前往範例指定的目的地。
<?php
$url = 'https://example.com/';
header('Location: ' . $url);
exit;
?>
請使用應用程式允許導向的網址。如果目的地來自請求資料,請用允許清單驗證,或依據可信任的應用程式路由建立網址;將任意使用者輸入直接用於重新導向,可能會把訪客帶往非預期的網站。若目的地是同一個應用程式中的路由,通常只需使用 /account/ 這類路徑。
建立帶有 HTTP 狀態碼的 PHP 重新導向輔助函式
可重複使用的 redirect 輔助函式可以同時接收目的地和回應狀態。header() 的第三個引數是狀態碼;第二個引數則控制是否以同名標頭取代先前的標頭。下方的輔助函式預設使用 302,這通常代表暫時重新導向;如果路由有其他需求,也可以指定不同的狀態碼。
<?php
function redirect(string $url, int $statusCode = 302): void
{
header('Location: ' . $url, true, $statusCode);
exit;
}
redirect('https://example.com/', 301);
?>
範例傳入 301,表示目的地已永久變更。只有在確定變更會持續生效時才使用此狀態碼;瀏覽器和其他用戶端可能會記住永久重新導向。302 代表暫時重新導向,若目的地可能變更,通常是較合適的預設值。PHP 的 header() 手冊說明了函式的參數;MDN 的 301 參考資料則介紹永久重新導向狀態碼。
提供的執行檢查已成功執行此輔助函式範例,且標準輸出為空;重新導向狀態和 Location 標頭屬於 HTTP 回應的一部分,不會以文字印出。請透過本機網頁伺服器執行 PHP 檔案,並在瀏覽器中查看導向結果。設定回應標頭後,函式會終止請求。在實際應用程式中,呼叫輔助函式前請先驗證網址,並依據目的地是暫時或永久變更來選擇狀態碼。Location 標頭和狀態碼都屬於 HTTP 回應,因此瀏覽器收到頁面本文之前,就能使用這種方式重新導向。
使用 JavaScript 作為用戶端重新導向備援
如果無法使用伺服器端重新導向,頁面可以透過 window.location 要求瀏覽器導覽至其他位置。這是用戶端導覽:PHP 傳送頁面內容,再由瀏覽器執行指令碼。這不是 PHP 輸出緩衝,也不會將 HTTP 回應轉變成伺服器端重新導向。此方法也需要啟用 JavaScript,因此若伺服器能在傳送頁面前決定目的地,請使用 PHP 的 header() 方法。
下方的瀏覽器頁面片段示範這種備援方式。將它加入本機網頁伺服器可提供的頁面,再於已啟用 JavaScript 的瀏覽器中開啟,即可查看瀏覽器前往指定目的地。這段片段是以瀏覽器端原始碼形式呈現,本文並未執行它。
<script>
window.location = "https://example.com/";
</script>
由於這段程式碼在瀏覽器中執行,因此無法將 301 之類的 HTTP 重新導向狀態碼加入瀏覽器已收到的回應。請固定目的地,或驗證用來組成目的地的任何值,就像處理伺服器端重新導向一樣。只有在用戶端導覽適合該頁面的情況下才使用此備援方式;停用 JavaScript 的訪客會留在原始頁面。