为啥我必须在 AWS Application Load Balancer 中禁用 HTTP/2 以防止出现 ERR_SPDY_PROTOCOL_ERROR?

Posted

技术标签:

【中文标题】为啥我必须在 AWS Application Load Balancer 中禁用 HTTP/2 以防止出现 ERR_SPDY_PROTOCOL_ERROR?【英文标题】:Why did I have to disable HTTP/2 in AWS Application Load Balancer to prevent ERR_SPDY_PROTOCOL_ERROR?为什么我必须在 AWS Application Load Balancer 中禁用 HTTP/2 以防止出现 ERR_SPDY_PROTOCOL_ERROR? 【发布时间】:2019-06-04 16:00:51 【问题描述】:

当我使用 Application Load Balancer (ALB) 将我的 Web 应用程序部署到 AWS 环境时,我的一些 Web 服务端点不会返回任何数据,并且我的 Chrome 浏览器会在某些情况下报告此错误http 调用:ERR_SPDY_PROTOCOL_ERROR

在找到 this recommendation 后,我在 ALB 配置中禁用了 HTTP/2 支持,现在一切正常。

为什么我必须在 ALB 中禁用 HTTP/2?这里的根本问题是什么?我是否需要更改我的网络服务代码中的某些内容才能使用 HTTP/2

更新

这里是响应头:

HTTP/1.1 200
Date: Wed, 09 Jan 2019 21:39:13 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Locations Reached: Data to populate locations reached map

正如以下答案之一所建议的那样,罪魁祸首可能是我的一个标题(到达的位置)名称中有一个空格,该空格无效/格式错误。我会确保空格被破折号代替。

【问题讨论】:

【参考方案1】:

通常意味着您的 HTTP/2 标头无效。 HTTP/2 在这方面比 HTTP/1.1 更严格。

因此,名称中带有冒号、空格、新行(例如,打开引号但忘记关闭配置中的引号)等的 HTTP 标头名称是无效的(这些可以存在于标头值中,但不能存在于名称中) .

有关如何调试的详细信息,请参见此处:https://www.michalspacek.com/chrome-err_spdy_protocol_error-and-an-invalid-http-header。

将您的 HTTP/1.1 响应标头添加到您的问题中,或许能够为您指明正确的方向。

【讨论】:

啊,谢谢。我的一个响应标题名称中有一个空格(请参阅我更新的问题)。这可能就是问题所在。 就是这样。在 HTTP 中是非法的,但在 HTTP/1.1 中很少强制执行。解决这个问题,我敢打赌 HTTP/2 可以工作。

以上是关于为啥我必须在 AWS Application Load Balancer 中禁用 HTTP/2 以防止出现 ERR_SPDY_PROTOCOL_ERROR?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS 上修复 Django“ModuleNotFoundError: No module named 'application'”?

请教高手:为啥EXCEL中函数VLOOKUP运用必须排列整齐

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

AWS Elastic Beanstalk - 脚本在返回标头之前超时:application.py

AWS Elastic Beanstalk - 脚本在返回标头之前超时:application.py

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