<?php
// 必須在任何輸出之前
header("HTTP/1.1 404 Not Found");
header("Status: 404 Not Found"); // 兼容 CGI/FCGI 模式
// 可選:輸出自訂 404 頁面內容
include __DIR__ . '/404.html';
exit;
?>
ErrorDocument 404 /404.php
Apache 會內部重導向至 /404.php,PHP 腳本正常執行,$_SERVER['REDIRECT_STATUS'] 為 404。
# 錯誤寫法:Nginx 會發送 302 重導向,瀏覽器再請求 404.php,狀態碼變 200
error_page 404 /404.php;
# 正確寫法:等號強制內部重導向,保持 404 狀態碼
error_page 404 = /404.php;
= 符號指示 Nginx 保持原始錯誤碼進行內部重寫,PHP 端收到的 $_SERVER['REDIRECT_STATUS'] 即為 404。
<?php
// 確保狀態碼正確(Nginx + = 時可省略,保留更保險)
if (php_sapi_name() !== 'cli') {
header("HTTP/1.1 404 Not Found");
header("Status: 404 Not Found");
}
// 避免搜尋引擎收錄
header("X-Robots-Tag: noindex, nofollow");
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>404 - 頁面不存在</title>
</head>
<body>
<h1>404 - 找不到頁面</h1>
<p>您訪問的頁面可能已移除或網址輸入錯誤。</p>
<a href="/"><- 返回首頁</a>
</body>
</html>
掌握 Nginx error_page 404 = /404.php 與 PHP header("HTTP/1.1 404 Not Found") 雙重保障,確保 404 狀態碼正確傳遞給瀏覽器與搜尋引擎。