Php

Apache 報告不存在的 WordPress URL 的 200 狀態

  • June 22, 2012

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

德。

引用自:https://serverfault.com/questions/401341