http - TypeError:通过 HTTP2 调用 204(无内容)和 304(未修改)的网络请求失败(Chrome 中的 ERR_HTTP2_PROTOCOL_ERROR)
问题描述
我们已从协议切换HTTP1.1
到HTTP2
协议,并注意到一些请求失败。当服务器响应204
或304
我们收到以下错误时:
TypeError:网络请求失败
Chrome 还在网络选项卡上显示以下错误:ERR_HTTP2_PROTOCOL_ERROR
解决方案
经过一番研究,我们发现了问题所在。HTTP2
协议的语法更严格HTTP1.1
。例如,它不允许正文204
或304
响应。这些响应不应该包含正文是合乎逻辑的,但HTTP1.1
不需要使这些“奇怪的”响应失败,同时HTTP2
要求客户端不接受这样的响应。
我们还发现,即使我们没有正文或content-length
标题,但我们确实有一个content-type
浏览器也不接受的标题,而逻辑HTTP1.1
只是忽略了这个标题。
我根本没有在互联网上找到太多关于此的信息。我得到的最接近的是HTTP2 RFC,甚至在细节上也有点模糊。它没有直接说明应该拒绝304
具有标头的响应,但我认为这就是浏览器在现实中实现它的方式。content-type
TLDR:
204
并且304
响应不能包含正文content-length
或content-type
标题。这样的响应将被浏览器(可能还有其他客户端)视为网络错误。
PS 可能其他响应码也有类似限制
PPS 向在该主题上进行了原创研究的Morten Cools表示敬意
推荐阅读
- apache-kafka - 无法使用 pykafka 发送消息
- flutter - Flutter 中的窗口是否可复制
- oracle - ASH: IN_PARSE 和 IN_SQL_EXECUTION 同时?
- python - 为什么使用正则表达式的 str.match 在 Pandas 中不起作用
- batch-file - 用户只能按数字文件夹选择列表
- vb.net - 图表未正确绘制数据 (Visual Basic)
- facebook - 如何解决 facebook 登录插件配置器错误?
- azure - 针对 azure devops 服务连接授权管道
- apache-kafka - 需要识别空闲的 kafka 消费者
- php - 从php中的2个数组中找到唯一的数组