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时,这个重写规则被打到,redirect到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 "-" {...}
这对我来说是有道理的,因为原来的请求被redirect到存在的页面(index.php)。 有没有办法强制Apache将404交换报告?
我的问题是来自坏人的虚假请求在我使用的各种服务器统计软件(AWStats,Analog等)中显示为“成功请求”。 我很乐意让他们在404上出现在404上,这样他们就可以从生成的统计报告中过滤出来。
我尝试添加下面的行到我的.htaccess,但它没有任何效果(我猜和原来的redirect规则相同的原因):
ErrorDocument 404 /index.php?error=404
有没有人有一个聪明的方法来解决这个烦恼?
附加信息:
header()任何地方) 尝试在您的RewriteRule行上将[L]更改为[R=404,L] 。 这将发送404到客户端和您的服务器日志。 为了避免显示默认的错误页面,你可以使用ErrorDocument 404 /index.php?error=404来渲染你之前说过的ErrorDocument的尝试。
您也可以使用WP htaccess Control插件来帮助pipe理跨越升级的htaccess文件。
如果你可以编辑模板 – 你很幸运 – 在这种情况下 – 编辑它以输出404或其他任何代码。 作为apache它的日志发生(在大多数情况下)后PHP – 这些状态代码是在日志中选取一般设置(虽然大量例外)。
见http://php.net/manual/en/function.header.php
DW。