AWS Application Load Balancer 将所有标头转换为小写

Posted

技术标签:

【中文标题】AWS Application Load Balancer 将所有标头转换为小写【英文标题】:AWS Application Load Balancer transforms all headers to lower case 【发布时间】:2017-02-13 17:43:03 【问题描述】:

我有一个在两个 EC2 实例中运行的 REST API 应用程序,并且长时间使用 AWS Classic Load Balancer。 REST API 的客户端依赖于响应头(例如Location)。

我知道 HTTP 标头在定义上是不区分大小写的,但是(不幸的是)一些客户端忽略了这一点并以区分大小写的方式检查标头(例如,他们希望 Location 以大写开头)。

最近我已更改为 AWS Application Load Balancer,现在我看到它会将所有响应标头转换为小写,因此客户端无法正确处理响应。

我有几个问题。

    这是 Application Load Balancer 的预期行为吗? 有没有办法将其配置为返回应用程序构建的标头?

【问题讨论】:

“最近我已更改为 AWS Application Load Balancer,现在我看到它会将所有响应标头转换为小写,因此客户端无法正确处理响应。”你的这句话对我有帮助,我以为负载均衡器正在删除我的标题,但结果他们把它们变成了小写......谢谢 【参考方案1】:

这是 ALB 的预期功能,因为 HTTP/2 lowercases all headers 和 ALBs support HTTP/2。不幸的是,您无法修改 ALB 处理标头的方式。

更新:请参阅下面的 cmets。我关于 ALB 由于支持 HTTP/2 而将请求标头小写的说法可能不准确。

【讨论】:

测试表明此答案部分不正确或不完整。当请求在 HTTP/2 模式下处理时,ALB 确实似乎将标头强制为小写——这是必须的——但是当客户端不支持 HTTP/2 时,这种强制不会 似乎正在发生...所以它不仅仅是因为 ALB 支持 HTTP/2,而是因为客户端正在使用 HTTP/2。如果客户端看到小写的标头,那么看起来客户端必须与 ALB 进行 HTTP/2 通信……这意味着如果小写失败,客户端将被破坏。 这是否表明如果 REST 客户端是 HTTP/1,那么 vtor 的区分大小写的客户端将按预期运行? 这似乎表明,是的......所以要么其余客户端是 HTTP/2 并且已经破坏了标头解释,要么问题的性质被错误识别。 感谢您深入研究。 @Michael-sqlbot 和 jbird 感谢您的回答。客户端确实以错误的方式处理标头(自定义检查等)并且他们使用 HTTP2。【参考方案2】:

当我们从 TCP ELB 切换到 HTTPS ELB 时,这导致我们损坏的客户端失败。

在修复客户端时,我们暂时禁用了默认启用的新 ELB HTTP/2 支持。

【讨论】:

以上是关于AWS Application Load Balancer 将所有标头转换为小写的主要内容,如果未能解决你的问题,请参考以下文章

AWS Application Load Balancer 向不健康的目标组/实例发送请求

AWS - ECS + Application Load Balancer的思考

Socket.io + Nginx + AWS Application Load Balancer 连接在建立之前关闭

AWS CloudFormation:Application Load Balancer 的目标组不适用于多个 EC2 实例

如何使用 .ebextensions 将 Application Load Balancer 固定响应添加到 AWS Elastic Beanstalk

将 https 侦听器添加到 AWS Application Load Balancer 时出现问题