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.