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

AWS ELB 400 BAD_REQUEST с пробелом в конце URI

Мы используем AWS ELB для балансировки нагрузки HTTP / S, и мы столкнулись с довольно сумасшедшей проблемой с ELB.

$ curl -i "http://yourdomain.com/ "
HTTP/1.1 400 BAD_REQUEST
Content-Length: 0
Connection: Close

Похоже, что AWS ELB каким-то образом split(' ', $first_line)[2] ищу версию HTTP / 1.x. Понятно, что этот запрос технически некорректен. Между URI и версией HTTP / 1.x должен быть один пробел. Но действительно? В отличие от любого другого HTTP-демона в Интернете, этот простой запрос не выполняется с помощью AWS ELB.

Это правда? Может ли кто-нибудь еще воспроизвести эту проблему?

Это немного устарело, но, надеюсь, ответ может помочь другим. У меня такая же проблема с некоторыми встроенными устройствами, выполняющими запросы GET к некоторым веб-серверам и прокси-серверу ELB (я не могу изменить код, выполняющий запросы HTTP).

Прокси-сервер ELB обрабатывает это правильно (и вы получаете правильный ответ: 400 Плохой запрос). Пробелы должны быть закодированы в URL. Некоторые веб-серверы и прокси-серверы терпимы к этим пространствам (примеры Apache и Squid, по крайней мере, последние версии), но любое программное обеспечение, работающее в AWS ELB, нет.

Мое обходное решение состояло в том, чтобы настроить балансировщик нагрузки на выполнение TCP Passthrough для порта 80 (прослушивание порта 80, отправка на порт 80 экземпляра), чтобы запрос обрабатывался непосредственно сервером Apache в экземплярах EC2 за балансировщиком нагрузки. (В этой конфигурации нет привязки экземпляра, но для моего приложения это не требуется). Как уже упоминалось, Apache, похоже, в порядке с этим дополнительным пространством в конце URL-адреса.