试图实现HTTP2推送

问题描述:

从我读过的(其中包括Smashing mag文章和Akamai文章)实现HTTP2服务器推送包括简单地向我的网站上的页面添加一个或两个标头。例如:试图实现HTTP2推送

Link: </css/styles.css>; rel=preload; as=style 
Link: </js/common.js>; rel=preload; as=script 

这是准确的吗?这真的很简单吗?

它完全取决于您运行的Web服务器以及它如何实现HTTP/2推送(如果有的话)。

使用Link Headers适用于Apache。 Nginx目前不支持服务器推送。一些CDN也使用链接标头来实现它。

然而,即使它很容易启用,你可能不应该没有进一步的思考。问题是,虽然这可能会加速第一次加载,然后你的JavaScript和CSS将被缓存(你正在缓存你的资源客户端不是吗?如果不是,那么甚至不要看高级主题,如HTTP/2直到你获得基本的权利)。所以如果你推动它已经被缓存,这是一种浪费。现在浏览器可以停止推送,如果它不需要这个资源,因为它已经有了这个例子,但是这仍然需要时间和精力,而对于小资源(比如CSS或JavaScript),它可能会有很多当你停下来的时候下载。

所以你应该只在客户需要资源的可能性很高时才推送。 Cache-Digests将是客户端告诉服务器它已经缓存了哪些资源的一种方式,因此可以帮助服务器决定是否推送,但是它仍然是一项正在进行的工作,如果有任何浏览器支持它,它也不会离开。在此期间,我在Apache中完成了一个简单的基于cookie的实现,这可能会对您感兴趣:https://www.tunetheweb.com/performance/http2/http2-push/

+0

感谢您的答案 - 我已将Link:标题添加到我的网站首页(https: //www.rgraph.net),但根据Chromes瀑布图中的Initiator列,styles.css的下载不会被push触发。虽然说如果我将链接:标题中的URL更改为不存在的东西,它确实会导致请求列表中出现404(在网络面板中)。所以也许它工作 - 也许不是。 – Richard

+0

您正在使用的资产需要由页面使用。看看你的网站,你试图推foo.css,但1)不存在和2)它没有被引用在你的HTML的任何地方,所以没有意义被推。 –

+0

这只是一个测试。我真正想推入的东西是styles.css - 所以我添加了这个PHP来添加链接标题:header('Link:/styles.css>; rel = preload; as = style');标题发送正常,我可以在Chrome网络面板中看到 - 但发起人并未提及“推送”。 – Richard