Apache 報告不存在的 WordPress URL 的 200 狀態
WordPress .htaccess 一般有以下重寫規則:
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
當我在我的網站上訪問一個不存在的 URL 時,這個重寫規則會被命中,重定向到index.php,並提供我的自定義404.php模板文件。發送回客戶端的狀態碼是正確的 404,如以下 HTTP Live Headers 輸出範例所示:
http://www.borngeek.com/nothere/ GET /nothere/ HTTP/1.1 Host: www.borngeek.com {...} HTTP/1.1 404 Not Found
但是,Apache 在我的伺服器日誌中使用 200 狀態程式碼報告整個交換,如下面的日誌片段所示(為簡單起見進行了修剪):
{...} "GET /nothere/ HTTP/1.1" 200 2155 "-" {...}
這對我來說很有意義,因為原始請求被重定向到存在的頁面(index.php)。有沒有辦法強制 Apache 將交換報告為 404?
我的問題是來自 Bad Guys 的虛假請求在我使用的各種伺服器統計軟體(AWStats、Analog 等)中顯示為“成功請求”。我希望它們在 Apache 端顯示為 404,以便從生成的統計報告中過濾掉它們。
我嘗試將以下行添加到我的 .htaccess 中,但沒有任何效果(我猜測原因與之前的重定向規則相同):
ErrorDocument 404 /index.php?error=404
有沒有人有聰明的方法來解決這個煩惱?
附加資訊:
- 作業系統是 Debian 6.0.4,Apache 版本看起來是 2.2.22-3(託管在 DreamHost 上)
- 正在發送回客戶端的 404 是由 WordPress 設置的(即我沒有
header()
在任何地方手動呼叫)
嘗試更改
[L]
您[R=404,L]
的 RewriteRule 行。這將向客戶端和您的伺服器日誌發送 404。為避免顯示預設錯誤頁面,您可以使用ErrorDocument 404 /index.php?error=404
在您說您之前嘗試過的 ErrorDocument 上呈現嘗試。您還可以使用WP htaccess Control外掛來幫助管理跨升級的 htaccess 文件。
如果您可以編輯模板 - 你很幸運 - 在這種情況下 - 編輯它以輸出 404 或任何其他程式碼。作為 apache,它的日誌記錄(在大多數情況下)發生在 PHP 之後 - 這些狀態程式碼在一般設置的日誌中被拾取(儘管有很多例外)。
見http://php.net/manual/en/function.header.php
德。