O WordPress .htaccess geralmente tem as seguintes regras de reescrita:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Quando acesso um URL inexistente em meu site, essa regra de reconfiguração é acessada, redireciona para o index.php e exibe meu modelo 404.php personalizado Arquivo. O código de status que é enviado de volta ao cliente é o 404 correto, conforme mostrado neste exemplo de saída HTTP Live Headers:
http://www.borngeek.com/nothere/
GET /nothere/ HTTP/1.1
Host: www.borngeek.com
{...}
HTTP/1.1 404 Not Found
No entanto, o Apache relata toda a troca com um código de status 200 no log do servidor, conforme mostrado aqui em um snippet de log (aparado para simplificar):
{...} "GET /nothere/ HTTP/1.1" 200 2155 "-" {...}
Isso faz algum sentido para mim, visto que a solicitação original foi redirecionada para a página que existe (index.php). Existe uma maneira de forçar o Apache a relatar a troca como um 404?
Meu problema é que solicitações falsas vindas de Bad Guys aparecem como "solicitações bem-sucedidas" nos vários softwares de estatísticas de servidor que uso (AWStats, Analog, etc). Eu adoraria que eles aparecessem no lado do Apache como 404s para que eles fossem filtrados dos relatórios de estatísticas gerados.
Eu tentei adicionar a seguinte linha ao meu .htaccess, mas não teve efeito (acredito pelo mesmo motivo que as regras de redirecionamento anteriores):
ErrorDocument 404 /index.php?error=404
Alguém tem uma maneira inteligente de corrigir esse problema?
Informações adicionais:
- OS é Debian 6.0.4, e a versão do Apache parece ser 2.2.22-3 (hospedada no DreamHost)
- O 404 que está sendo enviado de volta ao cliente está sendo definido pelo WordPress (ou seja, não estou chamando manualmente
header()
em qualquer lugar)