Redirecionando pedidos que resultariam em um erro HTTP 400 (Bad Request) (Apache 2.2)

1

Devido a uma vulnerabilidade de segurança no Wordpress, várias das minhas postagens foram renomeadas para algo como:

http://**MYSITE**/2008/08/21/**POSTNAME**/%&%28%7B$%7Beval%28base64_decode%28$_SERVER%5BHTTP_EXECCODE%5D%29%29%7D%7D%7C.+%29&%/

Desde então, resolvi o problema, atualizei o Wordpress e também atualizei meu servidor Web para o Apache 2.2.3. O problema é que agora tenho um monte de URLs indexados no Google e vinculados a outros sites. O Google eventualmente os removerá de seus índices, mas enquanto isso eu quero reescrever os URLs ruins para corrigir os URLs.

Eu tentei a seguinte regra mod_rewrite, mas parece que não funciona. Parece que o Apache está vendo o pedido como "ruim" e apenas retornando um erro HTTP 400 sem consultar o mod_rewrite (ou mod_redirect). Aqui está a regra que eu tentei:

RewriteRule ^(20[0-9]{2}/[0-1][0-9]/[0-3][0-9]/[^/]+)/.*base64.*$ http://***MYSITE***/$1 [L,R=302,QSA]

Que coincide quando eu testo em uma ferramenta de expressão regular, mas não parece fazer nenhuma diferença para o Apache. Alguém já se deparou com este problema? Qualquer solução possível?

Obrigado!

Chris

    
por inxilpro 02.03.2010 / 22:00

2 respostas

3

Você pode definir um ErrorDocument personalizado para os 400 erros assim:

ErrorDocument 400 /cgi-bin/handle400.cgi

e depois ter esse cgi (ou php ou servlet ou qualquer outro) faz a reescrita do cabeçalho e o redirecionamento de localização.



EDIT: por causa da resposta do Jacek acabei de testar acima da solução para confirmar que funciona no Apache 2.2.

Minha configuração do servidor:

ScriptAlias     /cgi-bin/ "/var/www/cgi-bin/"
ErrorDocument   400 /cgi-bin/handle400.pl

lukas $ cat /var/www/cgi-bin/handle400.pl

#!/usr/bin/perl
print "Content-type: text/html\n\n";
while (my ($key, $val) = each %ENV) {
        print "$key = $val<BR>\n";
}
exit 0;

Agora, ao acessar a URL quebrada que produziria um erro 400 Bad Request antes, agora recebo a seguinte saída (parcial):

...
REDIRECT_REQUEST_METHOD = GET
REDIRECT_STATUS = 400
REMOTE_ADDR = xx.xx.xx.xx
REQUEST_URI = /%&%28%7B$%7Beval%28base64_decode%28$_SERVER%5BHTTP_EXECCODE%5D%29%29%7D%7D%7C.+%29&%/
GATEWAY_INTERFACE = CGI/1.1
SCRIPT_URL = /cgi-bin/handle400.pl
...

Assim, você obtém informações suficientes para fazer uma alteração de código de status e um redirecionamento de local adequados.

    
por 07.03.2010 / 08:51
0

'400 Solicitação incorreta' significa que a solicitação está tão corrompida que não pode ser analisada / entendida pelo servidor. Isso significa que o servidor não possui dados da requisição (mesmo a URL), então não há nada que o mod_rewrite, ou qualquer outra ferramenta que manipule dados de pedidos, possa fazer sobre isso.

    
por 07.03.2010 / 12:09