使用 Amazon ELB 时 URL 的长度是否有限制?如果是这样,有没有办法增加它?

Jor*_*dan 2 url amazon-elb

由于 Amazon ELB 截断了一个长(超过 1K 个字符)的 URL,我们似乎遇到了错误。

我已经搜索了常见的嫌疑人,但找不到关于 Amazon ELB 的 URL 长度限制的任何讨论。

亚马逊网址的长度有限制吗?如果是这样,有没有办法增加该限制?

Lad*_*ada 6

我使用一个简单的 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
Run Code Online (Sandbox Code Playgroud)

这工作得很好一段时间:

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
Run Code Online (Sandbox Code Playgroud)

但是一旦越过 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
Run Code Online (Sandbox Code Playgroud)

Apache 将失败的请求记录在不同的文件中,因为该GET字符串位于Host:标头之前,因此 Apache 从未确定要使用哪个 vhost。

尽管如此,它仍然Apache的响应,而不是ELB,甚至达到了128KB在一个单一的GET字符串。完整的 128KB 请求记录在默认的 Apache 日志文件中。256KB后,curl处理请求失败。

Amazon ELB 中似乎没有任何 URL 长度限制。


小智 6

我们从 AWS Support 收到以下答复(格式化我的):

请注意,所有负载均衡器的 URI 长度都有限制,当您收到 414 错误时,您的 GET 请求必须超过以下限制。

应用程序负载均衡器 (ALB)

对于 ALB,HTTP/1.x 标头和 HTTP/2 标头的 HTTP 标头限制存在差异。请参阅有关HTTP 标头限制的文档。

Application Load Balancer 的HTTP/1.x 标头具有以下大小限制:

  • 请求行:16K
  • 单头:16K
  • 整个标题:64K

Application Load Balancer 的HTTP/2 标头具有以下大小限制:

  • 请求行:16K
  • 单头:16K
  • 整个标题:64K

经典负载均衡器 (CLB)

CLB 施加的唯一限制是 HTTP 动词(GET、POST 等)的长度,并且该长度必须为 127 字节或更少,任何大于此值的动词都会导致 CLB 返回 HTTP 错误 405“METHOD_NOT_ALLOWED” .

网络负载平衡器 (NLB)

由于 NLB 在开放系统互连 (OSI) 模型的第四层运行,因此对 HTTP 标头没有限制。它尝试在侦听器配置中指定的端口上打开与选定目标的 TCP 连接。