网::ERR_HTTP2_PROTOCOL_ERROR是关于什么的?

2022-08-30 06:40:00

我目前正在开发一个网站,该网站会在谷歌浏览器上触发错误。我不确定究竟是什么会引起此错误,我只是注意到它仅在以HTTPS访问网站时弹出。我不能100%确定它是相关的,但看起来它阻止了JavaScript的正确执行。net::ERR_HTTP2_PROTOCOL_ERROR 200

例如,发生以下情况:

  1. 我正在以 HTTPS 格式访问网站

  2. 我通过 https://publish.twitter.com 集成的Twitter提要根本没有加载

  3. 我可以在控制台中注意到ERR_HTTP2_PROTOCOL_ERROR

  4. 如果我删除代码以加载Twitter提要,错误仍然存在

  5. 如果我以 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提要)。“网络”选项卡上的所有其他资产都有一个成功回报,但整个文档本身除外。line that failed in console

谷歌浏览器标题(有错误):

Chrome header

火狐头文件(无错误):

Firefox header

控制台中的请求返回以下成功: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也是如此)。


答案 1

在我的情况下,它是 - Web服务器上没有剩余的磁盘空间。


答案 2

几个星期以来,我也对这个“错误”感到恼火:

net :: ERR_HTTP2_PROTOCOL_ERROR 200

在我的情况下,它发生在PHP生成的图像上。

它是在水平上,特别是在这个:header()

header ('Content-Length:'. Filesize($cache_file));

它显然没有返回确切的大小,所以我删除了它,现在一切正常。

因此,Chrome会检查通过标头传输的数据的准确性,如果它不对应,它就会失败。

编辑

我发现为什么via被错误地计算:压缩在PHP文件上处于活动状态,因此排除有问题的文件将解决问题。将此代码放在 :content-lengthfilesizeGZIP.htaccess

SetEnvIfNoCase Request_URI ^ / thumb.php no-gzip -vary

它的工作原理,我们保留标题 。Content-length


推荐