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
德威。