我们已从协议切换HTTP1.1
到HTTP2
协议,并注意到一些请求失败。当服务器响应204
或304
我们收到以下错误时:
TypeError:网络请求失败
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表示敬意