AWS ELB 400 BAD_REQUEST,URI 末尾有空格

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 中失败。

这是真的吗?其他人能复制此问题吗?

答案1

这有点老了,但希望答案可以帮助其他人。我遇到了同样的问题,一些嵌入式设备向后面的一些 Web 服务器和 ELB 代理发出 GET 请求(我无法更改执行 HTTP 请求的代码)。

ELB 代理正确处理了这个问题(您得到了正确的答案:400 Bad request)。空格应该是 URL 编码的。一些 Web 服务器和代理可以容忍这些空格(Apache 和 Squid,至少是最新版本)但 AWS ELB 中运行的任何软件都不能。

我的解决方法是将负载均衡器配置为对端口 80 执行 TCP 直通(监听端口 80,发送到实例端口 80),以便请求由负载均衡器后面的 EC2 实例中的 Apache 服务器直接处理。(此配置没有实例粘性,但对于我的应用程序来说,这不是必需的)。如前所述,Apache 似乎可以接受 URL 末尾的额外空格。

相关内容