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