【问题标题】:Requests served from ServiceWorker are downgraded from HTTP/2 to HTTP/1.1ServiceWorker 提供的请求从 HTTP/2 降级到 HTTP/1.1
【发布时间】:2019-06-28 01:31:06
【问题描述】:

我发现服务工作者存在一个特殊问题,即使 HTTP 服务器是通过 HTTP/2 提供服务的,它也显然会将通过工作人员提供的网络请求降级到 HTTP/1.1。我在所有使用 ServiceWorkers 在 H2 上提供服务的网站上都发现了这一点。

我在我的网站上找到了这个,我认为这是 GatsbyJS 的问题。 显然有 already an issue open 表示 Chromium 中的一个错误。

这是预期的行为吗?这是哪里规定的?

这是我网站的link

【问题讨论】:

    标签: service-worker http2


    【解决方案1】:

    我刚刚在 Firefox 90 中也注意到了这种行为.. tbh,我不担心 - 服务工作者缓存的响应本地存储在客户端计算机上(不需要远程获取)所以 DevTools 是否显示请求因为 HTTP 1.1 或 2 对性能或功能没有影响。这不是降级。

    【讨论】:

      【解决方案2】:

      这是我不喜欢 Service Workers 的原因之一 - it messes up the Network tab。 Chrome(和 Firefox)基本上将其显示为两个请求:

      您会看到 Web 浏览器从 Service Worker 请求资产,然后 Service Worker 从服务器获取资产。

      第一个请求未正确显示。它显示为 HTTP/1.1,而且,当您单击请求时,您看不到 HTTP 请求标头。只有第二个请求显示为完整的 HTTP 请求(HTTP/2 以及完整的请求和响应标头)。如果您查看服务器日志,或者如果您删除服务工作者并查看网络选项卡中的磁盘缓存负载,它将显示为 HTTP/2。

      这有关系吗?可以说不是。 Service Worker 是浏​​览器的一部分,虽然我不知道它在低级别如何工作的确切细节(也找不到指定的位置),但浏览器可能并没有真正在浏览器和服务工作者。事实上,如果是这样,那么它就不是正确的,因为 HTTP 请求是针对服务器域的,因此被定向到错误的位置(要成为真正的 HTTP,它可能应该指向 localhost 和服务工作者所在的端口号跑下)!那么它是否应该显示 HTTP/1.1 以外的其他内容?或者显示使用的最终网络协议(在本例中为 h2)?也许吧。

      当您处理本地服务器/服务时,HTTP/1.1 和 HTTP/2 之间的差异可以忽略不计。 HTTP/2 通过高延迟、低带宽连接(客户端到服务器)而不是本地请求来实现它自己。正如我所说,ServiceWorker 到服务器的连接是通过 HTTP/2 请求的。

      在许多方面与使用 HTTP 缓存(磁盘缓存或内存缓存)时相同,浏览器从不显示原始 HTTP 请求标头 - 它只是显示:“显示临时标头”。同样,显示请求的标头(为该请求请求的标头,或用于缓存的原始请求的标头)可能会更有帮助。

      【讨论】:

      • 我也是这么想的。但是 Chrome 中的审计工具(依赖于 Chrome 团队的 Lighthouse 工具)将此标记为一个问题,它会发现 HTTP/1.1 的请求并要求对所有网络请求使用 h2。在实践中,它应该自动将网络优先级和 HTTP 首选项传递给 ServiceWorker 从缓存 API 执行的获取。据我所知,关于网络优先级的问题在这里与铬有关:bugs.chromium.org/p/chromium/issues/detail?id=872776
      • 这些不是“网络请求”。此外,像 Lighthouse 这样的工具非常擅长突出一般的最佳实践,但不应被视为福音。尽管总而言之,我同意将这些标记为 HTTP/1.1 令人困惑。
      • ^ 我同意。感谢您的详细解释。将答案标记为已接受。
      猜你喜欢
      • 2017-06-17
      • 2021-12-30
      • 2015-04-10
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      相关资源
      最近更新 更多