Вы могли определить пользовательский ErrorDocument для этих 400 Ошибок как так:
ErrorDocument 400 /cgi-bin/handle400.cgi
и затем имейте это, cgi (или php или сервлет или безотносительно) делают перезапись заголовка и перенаправление местоположения.
Править: из-за ответа Jacek я просто протестировал выше решения подтвердить, что это работает над Apache 2.2.
Моя конфигурация сервера:
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
ErrorDocument 400 /cgi-bin/handle400.pl
кошка lukas$/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;
Теперь при доступе к поврежденному URL, который произвел бы ошибку 400 Плохих Запросов прежде, я теперь получаю следующий (частичный) вывод:
...
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
...
Таким образом, Вы действительно получаете достаточно информации, чтобы сделать надлежащее изменение кода состояния и перенаправление местоположения.
'400 Плохих запросов' означают, что запрос так повреждается, он не может анализироваться/пониматься сервером. Это означает, что сервер не имеет никаких данных из запроса (даже URL), таким образом, нет ничего mod_rewrite, или любой другой инструмент, обрабатывающий данные запроса, может делать с этим.