从 ServiceWorker 提供的请求从 HTTP/2 降级到 HTTP/1。1

Requests served from ServiceWorker are downgraded from HTTP/2 to HTTP/1.1

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

我在我的网站上发现了这个,我认为这是 GatsbyJS 的问题。 显然有 already an issue open 这表明 Chromium 中存在错误。

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

这是我网站的link

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

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

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

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

当您处理本地 servers/services 时,HTTP/1.1 和 HTTP/2 之间的差异可以忽略不计。 HTTP/2 因高延迟、低带宽连接(客户端到服务器)而不是本地请求而独树一帜。正如我所说,ServiceWorker 到服务器的连接是通过 HTTP/2.

请求的

在很多方面与使用 HTTP 缓存(磁盘缓存或内存缓存)时相同,浏览器从不显示原始 HTTP 请求 headers - 它只显示:"Provisional headers are shown" .同样,显示请求的 headers 可能会更有帮助(为该请求请求的请求,或者用于缓存的原始请求的 headers)。

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