我们已经从 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
头。这种响应将被浏览器(可能还有其他客户端)视为网络错误。
P.S. 其他响应代码也可能有类似的限制。
P.P.S. Kudos to Morten Cools 有独创性的研究者