Apache 报告不存在的 WordPress URL 的 200 状态

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 时,此重写规则会被触发,并重定向到索引.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?

我的问题是,来自坏人的虚假请求在我使用的各种服务器统计软件(AWStats、Analog 等)中显示为“成功请求”。我希望它们在 Apache 端显示为 404,这样它们就会从生成的统计报告中被过滤掉。

我尝试将以下行添加到我的 .htaccess 中,但没有效果(我猜测原因与之前的重定向规则相同):

ErrorDocument 404 /index.php?error=404

有人有聪明的方法来解决这个烦恼吗?

附加信息:

  • 操作系统是 Debian 6.0.4,Apache 版本似乎是 2.2.22-3(托管在 DreamHost 上)
  • 发送回客户端的 404 是由 WordPress 设置的(即我没有header()在任何地方手动调用)

答案1

尝试将 RewriteRule 行更改[L][R=404,L]。这将向客户端和服务器日志发送 404。为了避免显示默认错误页面,您可以使用来ErrorDocument 404 /index.php?error=404呈现您之前尝试过的 ErrorDocument 尝试。

您还可以使用WP htaccess 控制插件可帮助您在升级过程中管理 htaccess 文件。

答案2

如果您可以编辑模板 - 您很幸运 - 在这种情况下 - 编辑它以输出 404 或任何其他代码。由于 apache 的日志记录(在大多数情况下)发生在 PHP 之后 - 这些状态代码在常规设置的日志中被拾取(尽管有很多例外)。

http://php.net/manual/en/function.header.php

德威。

相关内容