网::ERR_HTTP2_PROTOCOL_ERROR是关于什么的?
我目前正在开发一个网站,该网站会在谷歌浏览器上触发错误。我不确定究竟是什么会引起此错误,我只是注意到它仅在以HTTPS访问网站时弹出。我不能100%确定它是相关的,但看起来它阻止了JavaScript的正确执行。net::ERR_HTTP2_PROTOCOL_ERROR 200
例如,发生以下情况:
-
我正在以 HTTPS 格式访问网站
-
我通过 https://publish.twitter.com 集成的Twitter提要根本没有加载
-
我可以在控制台中注意到ERR_HTTP2_PROTOCOL_ERROR
-
如果我删除代码以加载Twitter提要,错误仍然存在
-
如果我以 HTTP 格式访问该网站,则会显示 Twitter 源,并且错误也会消失
Google Chrome是唯一触发该错误的Web浏览器:它在Edge和Firefox上都运行良好。(注意:我尝试使用Safari,我有类似的错误)kcferrordomaincfnetwork 303
我想知道它是否可能与服务器返回的标头有关,因为错误中提到了“200”,并且404 / 500页面不会触发任何内容。
问题是错误根本没有记录。谷歌搜索给我的结果很少。此外,我注意到它出现在最近的谷歌浏览器版本上。该错误不会在v.64.X上弹出,但在v.75 +上会弹出(无论操作系统如何;我正在研究Mac tho)。
可能与Firefox上的网站OK有关,但在Safari上无关(kCFErrorDomainCFNetwork错误303),也不是Chrome(net::ERR_SPDY_PROTOCOL_ERROR)
进一步调查的结果如下:
- 如果服务器返回 404 而不是 2XX,则错误不会在完全相同的页面上弹出
- 错误未在具有 HTTPS 证书的本地弹出
- 错误在不同的服务器上弹出(两者都是OVH的),它使用不同的证书
- 无论使用什么PHP版本,错误都会弹出,从5.6到7.3(使用的框架:Cakephp 2.10)
根据要求,下面是失败的资源的返回标头,这是整个网页。即使每个页面都有HTTP标头200触发错误,这些页面也总是在客户端的浏览器上加载,但有时缺少一个元素(在我的示例中,外部Twitter提要)。“网络”选项卡上的所有其他资产都有一个成功回报,但整个文档本身除外。
谷歌浏览器标题(有错误):
火狐头文件(无错误):
控制台中的请求返回以下成功: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时,它将停止向客户端发送DATA帧,从而停止响应(或下载)。该连接仍可用于其他请求,并且与已中止的请求/响应并发的请求/响应可能会继续进行。[...]当RST_STREAM从客户端传输到服务器时,请求的全部内容可能正在传输中,并将到达客户端,客户端将丢弃它。但是,对于较大的响应内容,发送RST_STREAM可能有很好的机会在发送整个响应内容之前到达服务器,因此可以节省带宽。"
所描述的行为与我能观察到的行为相同。但这意味着浏览器是罪魁祸首,然后我不明白为什么它发生在两个相同的页面上,一个有200个标题,另一个有404(如果我禁用JS也是如此)。