404 頁面是當使用者請求的資源在伺服器上不存在時回應的狀態碼。它不僅告訴搜尋引擎「這個頁面已不存在」,也能友善地引導使用者前往網站其他頁面,避免流失訪客。對於沒有 Apache 設定權限(如虛擬主機用戶)的開發者,透過 PHP 內建的 header() 函式即可輕鬆實作自訂 404 頁面。
最基本的做法是發送正確的 HTTP 標頭,再輸出提示文字:
<?php
header("HTTP/1.1 404 Not Found");
header("Status: 404 Not Found");
echo '頁面不存在 (404)';
exit();
?>
重點說明:
HTTP/1.1 404 Not Found:標準 HTTP 回應列,確保瀏覽器與搜尋引擎正確識別狀態。Status: 404 Not Found:相容 CGI/FastCGI 環境的備用標頭。header(),否則會觸發「Headers already sent」警告。exit() 防止後續程式碼繼續執行。將錯誤頁面邏輯與樣式分離,維護更容易:
<?php
header("HTTP/1.1 404 Not Found");
header("Status: 404 Not Found");
include(__DIR__ . "/../../404.htm"); // 建議使用絕對路徑
exit();
?>
404.htm 可包含完整 HTML 結構、網站導覽、搜尋框、網站地圖連結等,提升使用者體驗。
若擁有 Apache 覆寫權限,使用 .htaccess 更簡潔且效能稍佳:
ErrorDocument 404 /404.html
或直接修改 httpd.conf:
ErrorDocument 404 /404.htm
這樣 Apache 會直接處理 404 回應,不經由 PHP 解析器,減少資源消耗。
curl -I 或瀏覽器開發工具確認回應碼確為 404,而非 200 或 302。| 錯誤做法 | 正確做法 |
|---|---|
| 未送出 404 標頭,直接 include 頁面 | 務必先送 header("HTTP/1.1 404 Not Found") |
使用 header("Location: /404.php") 導向 | 這會回傳 302 Found,搜尋引擎不會視為 404 |
| 在輸出 HTML 後才呼叫 header() | header() 必須在任何輸出之前執行 |
掌握這些技巧,即使在受限的主機環境下,也能專業地處理 404 錯誤,兼顧 SEO 與使用者體驗。