什么是网路:: ERR_HTTP2_PROTOCOL_ERROR?

时间:2019-10-03 08:23:48

标签: google-chrome https http2

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

例如,发生以下情况:

  1. 我正在使用HTTPS访问网站

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

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

  4. 如果我删除了加载Twitter feed的代码,则错误仍然存​​在

  5. 如果我通过HTTP访问网站,则会显示Twitter feed,并且错误消失

Google Chrome是唯一触发该错误的Web浏览器:它在Edge和Firefox上均能正常运行。 (注意:我尝试使用Safari,但遇到类似的kcferrordomaincfnetwork 303错误)

我想知道它是否可能与服务器返回的标头有关,因为错误中提到了“ 200”,并且404/500页没有触发任何内容。

根本没有记录错误。 Google搜索给我的结果很少。此外,我注意到它出现在最近的Google Chrome浏览器版本中。该错误不会在v.64.X上弹出,但会在v.75 +上弹出(无论操作系统如何;我在Mac tho上工作)。

在此进行调查的任何线索将不胜感激!

谢谢。

特里斯坦


编辑1:可能与Website OK on Firefox but not on Safari (kCFErrorDomainCFNetwork error 303) neither Chrome (net::ERR_SPDY_PROTOCOL_ERROR)

相关

编辑2:以下是进一步调查的结果:

    如果服务器返回404而不是2XX,则
  • 错误不会在完全相同的页面上弹出
  • 使用HTTPS证书的本地错误不会弹出
  • 错误在使用不同证书的另一台服务器(都是OVH)上弹出
  • 无论使用什么PHP版本,从5.6到7.3(使用的框架:Cakephp 2.10),都会弹出错误消息。

编辑3:根据要求,以下是失败的资源(即整个网页)的返回标头。即使错误是在具有HTTP标头200的每个页面上触发的,这些页面也始终在客户端的浏览器中加载,但是有时会丢失一个元素(例如,外部Twitter feed)。除了整个文档本身,“网络”选项卡上的所有其他资产都有成功的返回值。 line that failed in console

Google Chrome标头(错误):

Chrome header

Firefox标头(无错误):

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

编辑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

对于我在this other post中读到的内容,“ 在HTTP / 2中,如果客户端要中止请求,它将发送RST_STREAM。当服务器收到RST_STREAM时,它将停止发送数据帧该连接仍可用于其他请求,并且与已中止的请求并发的请求/响应可能会继续进行。 [...] 到RST_STREAM从客户端行进到服务器时,请求的全部内容可能正在传输中,并将到达客户端,客户端将丢弃该请求。但是,对于较大的响应内容,发送RST_STREAM可能有机会在发送整个响应内容之前到达服务器,因此可以节省带宽。

所描述的行为与我可以观察到的行为相同。但这将意味着浏览器是罪魁祸首,然后我不明白为什么它会在两个相同的页面上发生,其中一个页面的标题为200,另一个页面的页面为404(如果我禁用JS,情况也是如此)。

31 个答案:

答案 0 :(得分:20)

在我的情况下-网络服务器上没有磁盘空间。

答案 1 :(得分:9)

在研究了我认为导致该错误的一些问题之后,我终于能够解决24个错误。我访问了网络上的所有页面。我很高兴地说,我找到了解决方案。 如果您使用的是NGINX,则将gzip设置为off,然后在服务器块中添加./mvnw -Pprod,swagger,webpack clean package -X,如下所示。


[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M1:enforce (enforce-versions) on project --: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed. -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M1:enforce (enforce-versions) on project --: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed.
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
        at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:309)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:194)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:107)
        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:993)
        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:345)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:191)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.apache.maven.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:39)
        at org.apache.maven.wrapper.WrapperExecutor.execute(WrapperExecutor.java:122)
        at org.apache.maven.wrapper.MavenWrapperMain.main(MavenWrapperMain.java:50)
Caused by: org.apache.maven.plugin.MojoExecutionException: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed.
        at org.apache.maven.plugins.enforcer.EnforceMojo.execute(EnforceMojo.java:243)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
        ... 27 more
[ERROR] 
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

为什么?因为实际上发生的是所有内容都被压缩了两次,我们不希望这样,对吧?!

答案 2 :(得分:4)

几个星期以来,这个“错误”“ net :: ERR_HTTP2_PROTOCOL_ERROR 200”也使我很烦,它发生在PHP生成的图像上。最后,它位于标头级别,尤其是在“标头('Content-Length:'。Filesize($ cache_file));;“上。这显然没有返回确切的大小...我删除了此标头,现在一切正常。显而易见,Chrome浏览器会检查通过标头传输的数据的准确性(如果不一致)=“ failed”

您真正的

编辑:14/11/2019 at 15:15 我发现了通过文件大小错误计算内容长度的原因:GZIP压缩在PHP文件上处于活动状态,因此只需通过中的“ SetEnvIfNoCase Request_URI ^ / thumb.php no-gzip -vary”排除相关文件即可。 htaccess。它也可以工作,并且我们保留标题Content-lenght。

答案 3 :(得分:3)

我遇到此问题是因为在向Chrome发送大量回复时,http2服务器关闭了连接

为什么? 因为它只是http2服务器的设置,所以名为 WriteTimeout

答案 4 :(得分:3)

此错误当前已解决:https://chromium-review.googlesource.com/c/chromium/src/+/2001234

但这对我有所帮助,更改了nginx设置:

  • 打开gzip;
  • add_header'Cache-Control''不存储,不缓存,必须重新验证,代理重新验证,最大年龄= 0';
  • 即将到期;

就我而言,Nginx充当Node.js应用程序的反向代理。

答案 5 :(得分:2)

我遇到了类似的问题,我在一个HTTP GET请求上收到ERR_HTTP2_PROTOCOL_ERROR。

我注意到Chrome更新正在等待中,因此我将Chrome浏览器更新到了最新版本,并且下次重新启动浏览器时错误消失了。

答案 6 :(得分:2)

没事

我没有弄清楚到底发生了什么,但是我找到了解决方案。罪魁祸首似乎是OVH的 CDN功能。我已经将其安装在主机服务上,但是由于我的域而被禁用(因为无论如何我都不觉得需要它)。以某种方式,启用它后,一切正常。我猜这迫使Apache使用HTTP2协议;我还不了解的是,我的每个标头中确实都提到了HTTP2,我认为这意味着服务器正在使用正确的协议进行应答。

无论如何,针对我的特殊情况的解决方案是在所有相关域上启用此CDN选项。如果有人更好地了解了这里可能发生的情况,请随时分享解释。

非常感谢任何帮助过的人!

答案 7 :(得分:1)

对我来说这是因为磁盘空间已满。

我的应用程序(服务器)在 docker 上运行。清理了一些空间,它开始工作了。

答案 8 :(得分:1)

默认情况下,nginx将上传大小限制为1MB。

使用client_max_body_size,您可以设置自己的限制,如

location /uploads {
    ...
    client_max_body_size 100M;
} 

您也可以在http或服务器块(See here)上设置此设置。

这解决了net :: ERR_HTTP2_PROTOCOL_ERROR的问题

答案 9 :(得分:1)

net :: ERR_HTTP2_COMPRESSION_ERROR-WORDPRESS

好的,我希望这对很多人有帮助。我已经经历了好几个星期了。我很抱歉,因为我正在使用WordPress。

net :: ERR_HTTP2_COMPRESSION_ERROR仅在Chrome:Incognito上出现。

我有Cloudflare用于CDN和HTML缓存,以及W3 Total Cache,用于最小化js,css和页面缓存,OP缓存,对象缓存,浏览器缓存。

现在,经过无数次故障排除后,我在禁用“浏览器缓存”时检测到该问题,之后,我修复了该问题

我修改了浏览器缓存(转到侧面板)

查找(“ HTTP严格传输安全策略”) 确保检查。根据该指令 将值设置为-max-age = EXPIRES_SECONDS; includeSubDomain:预加载

请注意,我正在使用子域。

答案 10 :(得分:1)

我几次遇到此错误,这是由于从服务器到客户端传输了大资源(大于3MB)所致。

答案 11 :(得分:1)

在我们的例子中,原因是无效的标题。 如编辑4中所述:

  • 获取日志
  • 在查看器中选择事件
  • 选择 HTTP2_SESSION

寻找类似的东西

HTTP2_SESSION_RECV_INVALID_HEADER

->错误=“标题名称中的字符无效。”

-> header_name =“ 字符集= utf-8

答案 12 :(得分:1)

当我使用Nginx服务器将node-js应用程序暴露给外部世界时,我遇到了这个问题。 Nginx使用gzip和Chrome将文件(css,js等)压缩后看起来像一样。

当我们发现node-js服务器也使用gzip压缩了内容时,问题就解决了。在某种程度上,这种双重压缩导致了这个问题。取消node-js压缩即可解决问题。

答案 13 :(得分:0)

我不相信这是问题所在,但通过 cPanel 我注意到 PHP 版本是 5.6,将其更改为 7.3 似乎可以解决它。这是一个 WordPress 网站。我注意到我可以访问图像和通用 PHP 文件,但加载 WordPress 本身导致了错误。

答案 14 :(得分:0)

似乎很多问题都可能导致 ERR_HTTP2_PROTOCOL_ERROR:在我的情况下,这是 php 生成的标头 Content-Type : text/plain 中的一个小语法错误。您可能会注意到冒号 之前的空格……就是这样。当冒号位于标题名称(如 Content-Type: text/plain)旁边时,没有问题。只花了一百万小时才弄明白……这个错误只发生在 Chrome 上,Firefox 毫无怨言地加载了对象。

答案 15 :(得分:0)

在我的情况下(Windows 上的 nginx 代理应用程序,同时自己提供静态资产)页面显示多个资产,包括 14 张更大的图片;恰好在 60 秒后,其中大约 5 个图像显示了这些错误;就我而言,它是 60 秒的默认 send_timeout,使这些图像请求失败;增加 send_timeout 使其工作

我不确定是什么导致 Windows 上的 nginx 服务这些文件的速度如此之慢——它只有 11.5MB 的资源,nginx 需要将近 2 分钟才能提供服务,但我想这是另一个线程的主题

答案 16 :(得分:0)

我在使用服务器发送事件时遇到了这个问题。当我注意到我用来启动连接的域名包含一个尾部斜杠时,问题就解决了,例如https://foo.bar.bam/ERR_HTTP_PROTOCOL_ERROR 工作时因 https://foo.bar.bam 失败。

答案 17 :(得分:0)

如果简单地重新启动,例如 Chrome Canary,使用新的配置文件解决问题,那么肯定 是 "victim" of a failed Chrome Variation!是的,有多种方法可以选择不参与 Chrome 的现场测试。

答案 18 :(得分:0)

就我而言 header params 不能设置 null 或空字符串

{
 'Authorization': Authorization  //Authorization can't use null or ''
}

答案 19 :(得分:0)

就我而言,WordPress 现在需要 PHP 7.4,而我运行的是 7.2。
我一更新,错误就消失了。

答案 20 :(得分:0)

对于那些从搜索引擎登陆的人。

我最近遇到了这个问题,尽管不是 PHP,而是 .NET 和 Angular。我在这里和 IIS 等的 MS 支持论坛上尝试了绝大多数建议。最后我不得不通过旧的控制面板重新安装/修复 IIS Express(这会恢复开发证书,我实际上并没有使用 IIS Express)并在应用程序的 HTTPS 绑定下禁用 HTTP/2。当然,这仅适用于开发环境。

答案 21 :(得分:0)

我还有另一种情况导致了ERR_HTTP2_PROTOCOL_ERROR,在此尚未提及。我在IOC(Unity)中创建了一个交叉引用,其中我有A类(通过几层)引用了B类,而B类则引用了A类。我的设计确实很糟糕。但是我为从类B调用的类A中的方法创建了一个新的接口/类,并清除了它。

答案 22 :(得分:0)

对我来说,由于递归代码,这是StackOverFlow异常。

答案 23 :(得分:0)

就我而言,我有一个带有nginx入口控制器和nginx + php-fpm的kubernetes集群,以处理drupal实例。

我在我的页面之一上注意到了这个问题,我的图片没有以chrome加载。 经过调查,我发现在Nginx入口中启用的modsecurity模块以某种方式产生了此问题。不完全知道为什么,但是禁用它之后,所有页面都可以正常加载。

最好的问候。

答案 24 :(得分:0)

对于我来说,此错误是由于在使用ORM进行父/子关系时从服务器发送的json中具有循环引用而引起的。因此,快速简便的解决方案是

JsonConvert.SerializeObject(myObject, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore })

更好的解决方案是创建不包含双方(父/子)引用的DTO。

答案 25 :(得分:0)

我们在具有较长Base64字符串的页面上遇到了此问题。发生问题是因为我们使用CloudFlare。

详细信息:https://community.cloudflare.com/t/err-http2-protocol-error/119619

论坛帖子中的关键部分:

在多个浏览器上的隐身标签上进行进一步测试后, 将代码从BASE64更改为真实的.png图像, 在任何浏览器中,问题再也不会发生。 .png大约有500kb 在成为base64之前,所以CloudFlare的问题在于 同一行上的文本(因为base64是长字符串)作为 域和heroku。如前所述,直接击中 Heroku网址也从未发生过该问题。

临时黑客是要在CloudFlare上禁用HTTP / 2。

希望其他人可以提供更好的解决方案,而无需在CloudFlare上禁用HTTP / 2。

答案 26 :(得分:0)

我的团队在我们提供的单个javascript文件中看到了这一点。其他所有文件都工作正常。我们从http2切换回http1.1,然后是net::ERR_INCOMPLETE_CHUNKED_ENCODINGERR_CONTENT_LENGTH_MISMATCH。我们最终发现,有一个公司过滤器(Trustwave)错误地检测到“信息泄漏”(我们怀疑它在我们的文件/文件名中检测到类似于社会保险号的某项)。让公司调整此过滤器可以解决我们的问题。

答案 27 :(得分:0)

我也遇到了这个错误,我认为背后可能有多种原因。我的是,ARR超时了。

在我的情况下,浏览器正在向反向代理站点发出请求,在该站点中我设置了重定向规则,而该代理站点最终正在请求实际站点。现在,要处理大量数据,需要花费超过2分钟5秒的时间,而我的服务器的“应用程序请求路由”超时设置为2分钟。我通过以下步骤增加ARR超时来解决此问题: 1.前往IIS 2.单击服务器名称 3.单击中间窗格中的“应用程序请求路由缓存” 4.单击右窗格中的“服务器代理设置” 5.增加超时 6.单击“应用”

答案 28 :(得分:0)

当我为example.com(new.example.com)注册一个新域名(例如“ new”)时,这发生在我身上。这个名字不能在我的位置临时解析几个小时,而可以在国外解析。因此,我使用了代理服务器来测试在chrome控制台中看到net::ERR_HTTP2_PROTOCOL_ERROR的一些AJAX帖子的网站。数小时后,当可以在本地重新命名该名称时,这些错误就消失了。

我认为该错误的原因是我的代理未重定向那些AJAX请求,它只是访问了一个未由本地DNS解析器解析的网站。

答案 29 :(得分:0)

由于我一直试图通过AJAX向我的PHP服务器发送DELETE请求,所以我上周一直遇到此问题。我最近升级了托管计划,现在我的主机上有一个SSL证书,用于存储PHP和JS文件。由于添加了SSL证书,因此我不再遇到此问题。希望这有助于解决这个奇怪的错误。

答案 30 :(得分:0)

发布大于1MB的文件时,我遇到了同样的问题(asp,c#-HttpPostedFileBase)(即使应用程序对文件大小没有任何限制),对我来说,简化模型类也有帮助。如果遇到此问题,请尝试删除模型的某些部分,然后查看它是否有任何帮助。听起来很奇怪,但对我有用。