使用 HTTP/2 推送,我可以在初始响应之前推送资产吗?

With HTTP/2 Push, can I push assets before the initial response?

我有一个包含 JS、CSS 和字体资源的网页。在确定 HTTP 状态代码和响应的 headers 之前,页面必须进行一些繁重的处理。

我想使用 HTTP/2 推送将资产发送到浏览器,而无需等待这种繁重的处理。时间线看起来像这样:

  1. 客户请求index.html
  2. 服务器为 script.jsstyles.cssfont.woff2
  3. 发送 PUSH_PROMISES
  4. 服务器发送 HTTP headers 和上述资产的数据
  5. 服务器进行一些繁重的处理以确定index.html响应...
  6. 服务器发送 HTTP headers 和 index.html
  7. 的数据

这可能吗?根据我对 Server Push in the HTTP/2 spec 的理解,这似乎是可能的。然而,这是我第一次深入研究 HTTP/2 规范,所以我肯定会遗漏一些东西。

是的,这是完全允许的,例如在 Apache 中是可能的,详情如下:https://icing.github.io/mod_h2/earlier.html

或者这里给出了 Node 的例子:https://github.com/bazzadp/http2-in-action/blob/master/Listing%205.3/app.js

其他服务器也可能允许这样做,但许多服务器使用预加载 HTTP headers 作为推送信号,因此需要将响应发回以显示 header。

一个额外的 103 Early Hint response has been defined 可以在处理您的主要响应时与这些 header 一起提前发回,但是对此的支持很差,尤其是因为某些实现会混淆以获取返回两个响应(103 后跟 200)。

你想做什么是可能的,但如何做的细节取决于你选择的技术。

您的应用程序需要具有明确的 HTTP/2 API 才能将资产推送到客户端。

例如,如果使用Java和Servlet,则需要使用Servlet 4.0引入PushBuilder API来显式推送资产,这可以独立于主资源完成回复,就像你想做的那样。

我确信其他技术(例如 NodeJS)具有您可以利用的类似 API,但您必须检查您正在使用的技术。