HTTP/2 客户端可以选择通过服务器推送接收哪些资源吗?

Can a HTTP/2 client choose which resources to receive via Server Push?

我有一个静态站点。为了加快站点加载速度,我想使用 HTTP/2 服务器推送将 CSS 推送到客户端。但是,我也担心移动客户端的带宽使用情况。

如果我指定要推送给客户端的资源(例如在nginx中使用http2_push <some file>)并且客户端已经在他们的缓存中有这个资源,客户端可以请求不推送资源吗?还是服务器一直推送资源?

我看了RFC 7540, sec. 8.2 - HTTP/2 Server Push,但我只发现客户端可以发送RST_STREAM请求来停止服务器推送。但是有没有一种方法可以让客户端选择推送哪些资源?

您可以设置一个cookie,服务器可以使用它来决定是否推送。我在这里有一个 Apache 实现:https://www.tunetheweb.com/performance/http2/http2-push/

这并不理想,因为可以独立于缓存清除 cookie,但我们现在可以做的最好。

Cache Digests was proposed as a solution to this problem, but work on this has stopped 由于缺乏兴趣 — 主要是出于对隐私的担忧。

HTTP/2 推送未能达到预期,可能导致性能下降而不是改进。通过资源提示预加载更干净,风险更小。例如,它也可以与 103 Early Hints status code - though support of that is not great either - see this Chrome issue 一起使用。