Перенаправление запросов, которые могут привести к ошибке HTTP 400 (неверный запрос) (Apache 2.2)
Из-за уязвимости в Wordpress, некоторые мои посты были переименованы в что-то вроде:
http://**MYSITE**/2008/08/21/**POSTNAME**/%&%28%7B$%7Beval%28base64_decode%28$_SERVER%5BHTTP_EXECCODE%5D%29%29%7D%7D%7C.+%29&%/
С тех пор я исправил проблему, обновил Wordpress, а также обновил свой веб-сервер до Apache 2.2.3. Проблема в том, что теперь у меня есть куча URL-адресов, которые проиндексированы в Google и связаны с другими сайтами. Google в конечном итоге удалит их из индекса, но в то же время я хочу переписать неправильные URL-адреса, чтобы исправить их.
Я пробовал следующее правило mod_rewrite, но, похоже, оно не работает. Похоже, что Apache видит запрос как "плохой" и просто возвращает ошибку HTTP 400, даже не обращаясь к mod_rewrite (или mod_redirect). Вот правило, которое я пробовал:
RewriteRule ^(20[0-9]{2}/[0-1][0-9]/[0-3][0-9]/[^/]+)/.*base64.*$ http://***MYSITE***/$1 [L,R=302,QSA]
Что соответствует, когда я тестирую его в инструменте регулярных выражений, но, похоже, не имеет никакого значения для Apache. Кто-нибудь сталкивался с этой проблемой? Любое возможное решение?
Спасибо!
Крис
2 ответа
Вы можете определить собственный ErrorDocument для 400 ошибок следующим образом:
ErrorDocument 400 /cgi-bin/handle400.cgi
и затем пусть этот cgi (или php, или servlet, или что-то еще) выполняет перезапись заголовка и перенаправление местоположения.
РЕДАКТИРОВАТЬ: из-за ответа Jacek я только что протестировал решение выше, чтобы подтвердить, что оно работает на Apache 2.2.
Конфигурация моего сервера:
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;
Теперь при доступе к неработающему URL-адресу, который раньше вызывал ошибку 400 Bad Request, теперь я получаю следующий (частичный) вывод:
...
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 или какой-либо другой инструмент, обрабатывающий данные запроса.