我目前正在做一个网站,在谷歌浏览器上触发一个 net::ERR_HTTP2_PROTOCOL_ERROR 200
错误。我不确定究竟是什么引起了这个错误,我只是注意到它只有在访问 HTTPS 网站时才会弹出。我不能100% 肯定它是相关的,但看起来它阻止 JavaScript 正确执行。
例如,发生以下情况:
我正在使用 HTTPS 访问网站
我通过 https://publish.twitter.com整合的 Twitter feed 根本没有加载
我可以在控制台中注意到 ERR_HTTP2_PROTOCOL_ERROR
如果我删除加载 Twitter 提要的代码,错误仍然存在
如果我使用 HTTP 访问网站,Twitter 提要就会出现,错误就会消失
Google Chrome 是唯一触发该错误的浏览器: 它在 Edge 和 Firefox 上都运行良好。
(注意: 我用 Safari 试过,也有类似的 kcferrordomaincfnetwork 303
错误)
我想知道它是否与服务器返回的头有关,因为在错误中提到了“200”,并且404/500页面不会触发任何东西。
问题是这个错误根本没有记录在案。谷歌搜索给我的结果非常少。此外,我注意到它出现在最近的谷歌浏览器发布版本中; 这个错误在 v.64.X 上没有出现,但是在 v.75 + 上出现了(不管操作系统是什么; 我正在研究 Mac tho)。
进一步调查的结果如下:
根据要求,下面是失败资源的返回标题,也就是整个网页。即使错误在每个有 HTTP 头200的页面上触发,这些页面总是在客户端浏览器上加载,但有时缺少一个元素(在我的例子中,外部 Twitter 提要)。Network 选项卡上的每个其他资产都有成功返回,除了整个文档本身。
谷歌浏览器头部(有错误) :
Firefox 头部(没有错误) :
控制台中的 curl --head --http2
请求返回以下成功:
HTTP/2 200
date: Fri, 04 Oct 2019 08:04:51 GMT
content-type: text/html; charset=UTF-8
content-length: 127089
set-cookie: SERVERID31396=2341116; path=/; max-age=900
server: Apache
x-powered-by: PHP/7.2
set-cookie: xxxxx=0919c5563fc87d601ab99e2f85d4217d; expires=Fri, 04-Oct-2019 12:04:51 GMT; Max-Age=14400; path=/; secure; HttpOnly
vary: Accept-Encoding
尝试使用 chrome://net-export/和 https://netlog-viewer.appspot.com工具更深入地了解这个请求是以一个 RST_STREAM 结束的:
t=123354 [st=5170] HTTP2_SESSION_RECV_RST_STREAM
--> error_code = "2 (INTERNAL_ERROR)"
--> stream_id = 1
对于我在 另一个职位中读到的内容,” 在 HTTP/2中,如果客户端想要中止请求,它会发送一个 RST_STREAM。当服务器接收到 RST_STREAM 时,它将停止向客户机发送数据帧,从而停止响应(或下载)。该连接仍可用于其他请求,并且与已中止的请求/响应并发的请求/响应可能继续进行。 [...] 当 RST_STREAM 从客户机传输到服务器时,请求的整个内容可能正在传输中,并将到达客户机,客户机将丢弃它。但是,对于大型响应内容,发送 RST_STREAM 可能有很好的机会在发送整个响应内容之前到达服务器,因此可以节省带宽。
所描述的行为与我能观察到的是一样的。但是这就意味着浏览器是罪魁祸首,那么我就不明白为什么这种情况会发生在两个相同的页面上,一个有200 响应头,另一个有404 响应头(如果我禁用 JS,情况也是一样)。