HTTP/2 服务器两次推送资产下载

Posted

技术标签:

【中文标题】HTTP/2 服务器两次推送资产下载【英文标题】:HTTP/2 server pushed asset downloading twice 【发布时间】:2019-10-10 22:45:49 【问题描述】:

我正在尝试使用由 Cloudflare 提供支持的 HTTP/2 服务器推送。我正在尝试使用以下 HTTP 标头推送两个资产...

Link: </img/whysoslow-hero.jpg>; rel=preload; as=image, </lib/bootstrap.min.css>; rel=preload; as=style

图像在样式表中作为背景图像被引用,并且被推送并正确使用(下载一次)。

但是,我在我的页面的 html 中引用样式表,就像这样...

<link rel="stylesheet" href="/lib/bootstrap.min.css">

...它正在被推送,但随后也被提取(下载了两次)。

我的网站是...https://whysoslow.co.uk

这是 Chrome 中“网络”选项卡的屏幕截图,显示资产已被推送,但随后样式表又被下载...

谁能向我解释为什么会发生这种情况以及我该如何解决?

编辑:

我已经注意到控制台说...

已找到“https://whysoslow.co.uk/lib/bootstrap.min.css”的预加载,但由于完整性不匹配而未使用。

所以是 SRI 检查失败了。但我不明白为什么,它正在获取相同的文件,所以它应该是相同的。为什么它们不一样?

【问题讨论】:

您为什么要对您的域所服务的资产使用 SRI?这通常用于其他域上不受您控制的资产(然后您无法推送)。 我使用 Gulp - 资产最初是从 CDN 加载的,但在我进行性能改进时将它们移动到本地托管。我现在已经删除了 SRI,因为就像你说的,现在没有必要了。 【参考方案1】:

既然我已经弄清楚了,我也设法找到了答案......

How to preload script using integrity and crossorigin

简答:您不能预加载和使用 SRI,目前尚不支持。

【讨论】:

以上是关于HTTP/2 服务器两次推送资产下载的主要内容,如果未能解决你的问题,请参考以下文章

HTTP/2 推送 JSON 负载

HTTP/2 服务器推送但它在 Apache2.4 上重新加载了推送的文件

nginx HTTP/2 模块是不是支持服务器推送?

HTTP 2 将支持服务器推送,这是啥意思?

Express http 2 服务器推送

HTTP/2 协议-服务端主动推送消息