我目前正在网站上,该网站net::ERR_HTTP2_PROTOCOL_ERROR 200
在Google Chrome浏览器上触发错误。我不确定究竟是什么会引起此错误,我只是注意到它仅在使用HTTPS访问网站时弹出。我不能100%确定是否相关,但是看起来它阻止了javascript的正确执行。
例如,发生以下情况:
我正在使用HTTPS访问网站
通过https://publish.twitter.com集成的我的Twitter feed 根本没有加载
我可以在控制台中注意到ERR_HTTP2_PROTOCOL_ERROR
如果我删除代码以加载Twitter feed,则错误仍然存在
如果我通过HTTP访问网站,则会显示Twitter feed,并且错误消失
谷歌浏览器是唯一会触发该错误的网络浏览器:它在Edge和Firefox上均可正常运行。(注:我尝试使用Safari,但出现类似kcferrordomaincfnetwork 303
错误)
我想知道它是否可能与服务器返回的标头有关,因为错误中提到了“ 200”,并且404/500页没有触发任何内容。
根本没有记录错误。Google搜索给我的结果很少。此外,我注意到它出现在最近的Google Chrome浏览器版本中。该错误不会在v.64.X上弹出,但会在v.75 +上弹出(无论操作系统如何;我在Mac tho上工作)。
在这一点上进行调查的任何线索将不胜感激!
提前致谢。
特里斯坦
编辑1:可能与Firefox上的“网站确定 ”相关,但与Safari上的“网站正常 ”无关(kCFErrorDomainCFNetwork错误303),也与Chrome无关(net :: ERR_SPDY_PROTOCOL_ERROR)
编辑2:来自进一步调查的结果如下:
- 如果服务器返回404而不是2XX,则错误不会在完全相同的页面上弹出
- HTTPS证书不会在本地弹出错误
- 错误在使用不同证书的其他服务器(均为OVH)上弹出
- 无论使用什么PHP版本,从5.6到7.3都会弹出错误(使用的框架:Cakephp 2.10)
编辑3:根据要求,下面是失败的资源(即整个网页)的返回标头。即使错误是在具有HTTP标头200的每个页面上触发的,这些页面也始终在客户端的浏览器中加载,但是有时会丢失一个元素(例如,外部Twitter feed)。除了整个文档本身,“网络”选项卡上的所有其他资产都有成功的返回值。
Google Chrome标头(错误):
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
编辑4:尝试深入使用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,情况也是如此)。