O Apache relata um status 200 para URLs do WordPress inexistentes

4

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)
por Jonah Bishop 20.06.2012 / 16:33

2 respostas

1

Tente alterar [L] para [R=404,L] na sua linha RewriteRule. Isso enviará um 404 para o cliente e seu log do servidor. Para evitar a exibição da página de erro padrão, você pode usar ErrorDocument 404 /index.php?error=404 para processar a tentativa em um ErrorDocument que você disse ter tentado antes.

Você também pode usar o plug-in WP htaccess Control para ajudar a gerenciar seus arquivos htaccess em upgrades.

    
por 20.06.2012 / 18:41
0

Se você puder editar o modelo - você está com sorte - nesse caso - edite-o como um 404 ou qualquer outro código. Como o apache, seu registro acontece (na maioria das circunstâncias) post PHP - esses códigos de status são capturados no log na configuração geral (muitas exceções, no entanto).

Veja o link

Dw.

    
por 20.06.2012 / 17:12