Назад | Перейти на главную страницу

Перенаправление запросов, которые могут привести к ошибке 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. Кто-нибудь сталкивался с этой проблемой? Любое возможное решение?

Спасибо!

Крис

Вы можете определить собственный ErrorDocument для 400 ошибок следующим образом:

ErrorDocument 400 /cgi-bin/handle400.cgi

а затем пусть этот cgi (или php, или сервлет, или что-то еще) выполняет перезапись заголовка и перенаправление местоположения.



РЕДАКТИРОВАТЬ: из-за ответа Яцека я только что протестировал вышеуказанное решение, чтобы подтвердить, что оно работает на 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 Bad request» означает, что запрос настолько сломан, что сервер не может проанализировать / понять его. Это означает, что на сервере нет данных из запроса (даже URL-адреса), поэтому mod_rewrite или любой другой инструмент, обрабатывающий данные запроса, не может с этим поделать.