由于 Amazon ELB 截断了较长的(超过 1K 个字符)URL,我们似乎遇到了错误。
我搜索了常见的嫌疑人,但没有找到有关 Amazon ELB 的 URL 长度限制的任何讨论。
Amazon URL 的长度有限制吗?如果有,有办法增加该限制吗?
答案1
我使用一个简单的 bash 脚本针对我在 ELB 后面运行的域进行了测试:
S='a';
URL='http://example.com/?foo=';
while true;
do
echo $URL$S | wc -c;
curl -I "$URL$S";
S=$S$S;
done
这种方法在一段时间内效果很好:
2081
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Date: Tue, 05 Feb 2013 15:01:44 GMT
Server: Apache/2.2.22 (Ubuntu)
Vary: Accept-Encoding
Connection: keep-alive
4129
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Date: Tue, 05 Feb 2013 15:01:46 GMT
Server: Apache/2.2.22 (Ubuntu)
Vary: Accept-Encoding
Connection: keep-alive
但一旦超过 8192 长度限制就会失败:
8225
HTTP/1.1 414 Request-URI Too Large
Content-length: 337
Content-Type: text/html; charset=iso-8859-1
Date: Tue, 05 Feb 2013 15:01:47 GMT
Server: Apache/2.2.22 (Ubuntu)
Vary: Accept-Encoding
Connection: keep-alive
16417
HTTP/1.1 414 Request-URI Too Large
Content-length: 337
Content-Type: text/html; charset=iso-8859-1
Date: Tue, 05 Feb 2013 15:01:47 GMT
Server: Apache/2.2.22 (Ubuntu)
Vary: Accept-Encoding
Connection: keep-alive
Apache 将失败的请求记录在不同的文件中,因为字符串GET
位于Host:
标头之前,因此 Apache 无法确定要使用哪个虚拟主机。
尽管如此,它曾是Apache 仍在响应,而不是 ELB,甚至单个字符串的大小超过 128KB GET
。完整的 128KB 请求记录在默认 Apache 日志文件中。超过 256KB 后,curl
无法处理请求。
看起来 Amazon ELB 中没有任何 URL 长度限制。
答案2
我们从 AWS Support 收到了以下答复(我的格式):
请注意,所有负载均衡器的 URI 长度都有限制,并且由于您收到 414 错误,因此您的 GET 请求一定超出了以下限制。
应用程序负载均衡器 (ALB)
对于 ALB,HTTP/1.x 标头和 HTTP/2 标头的 HTTP 标头限制有所不同。请参阅HTTP 标头限制。
HTTP/1.x 标头应用程序负载均衡器具有以下大小限制:
- 请求行:16K
- 单头:16K
- 整个头:64K
HTTP/2 标头应用程序负载均衡器具有以下大小限制:
- 请求行:16K
- 单头:16K
- 整个头:64K
传统负载均衡器 (CLB)
CLB 施加的唯一限制是 HTTP 动词(GET、POST 等)的长度,并且必须为 127 字节或更小,任何大于此的动词都会导致 CLB 返回 HTTP 错误 405“METHOD_NOT_ALLOWED”。
网络负载均衡器 (NLB)
由于 NLB 运行在开放系统互连 (OSI) 模型的第四层,因此对 HTTP 标头没有限制。它会尝试在侦听器配置中指定的端口上打开到选定目标的 TCP 连接。