TypeError: Network request failed for 204 (No Content) and 304 (Not Modified) call over HTTP2 (ERR_HTTP2_PROTOCOL_ERROR in Chrome)

TypeError: Network request failed for 204 (No Content) and 304 (Not Modified) call over HTTP2 (ERR_HTTP2_PROTOCOL_ERROR in Chrome)

我们已从 HTTP1.1 切换到 HTTP2 协议,并注意到某些请求失败。当服务器以 [​​=12=] 或 304 响应时,我们会收到以下错误:

TypeError: Network request failed

Chrome 还会在网络选项卡上显示以下错误:ERR_HTTP2_PROTOCOL_ERROR

经过一些研究,我们发现了问题所在。 HTTP2 协议在语法上比 HTTP1.1 更严格。例如。它不允许 body 用于 204304 响应。这些响应不应该包含 body 是合乎逻辑的,但是 HTTP1.1 不需要失败这些“奇怪”的响应,而 HTTP2 要求客户端不接受这样的响应。

我们还发现,即使我们没有 body 或 content-length header,我们也有一个 content-type header浏览器也不接受,而 HTTP1.1 的逻辑只是忽略了这个 header.

我在互联网上根本没有找到太多关于这方面的信息。我得到的最接近的是 HTTP2 RFC,甚至在细节上也有点模糊。它没有直接说明具有 content-type header 的 304 响应应该被拒绝,但我认为这就是浏览器在现实中实现它的方式。

TLDR:

204304 响应不能包含 body、content-lengthcontent-type header。此类响应将被浏览器(可能还有其他客户端)视为网络错误。

P.S。很可能其他响应码也有类似的限制

P.P.S。感谢 Morten Cools 对主题进行了原创性研究