【问题标题】:Trying to implement HTTP2 push尝试实现 HTTP2 推送
【发布时间】:2018-03-11 19:18:56
【问题描述】:

根据我所阅读的内容(其中包括一篇 Smashing mag 文章和一篇 Akamai 文章),实现 HTTP2 服务器推送只需向我网站上的页面添加一个或两个标题。例如:

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

这是准确的吗?真的那么容易吗?

【问题讨论】:

  • 测试提示:不要使用 Fiddler 进行测试,它会进入您的浏览器和服务器之间并中断 HTTP2 连接。没有 HTTP2 - 没有推送。

标签: push http2


【解决方案1】:

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

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

但是,即使它很容易启用,您也不应该不加思索。问题是,虽然这可能会加速第一次加载,但之后你的 JavaScript 和 CSS 将被缓存(你正在缓存你的资源客户端,不是吗?如果没有,那么甚至不要看 HTTP 之类的高级主题/2 直到您掌握了正确的基础知识)。所以如果你在它已经缓存的时候推送它是一种浪费。现在浏览器可以停止推送,如果它不需要该资源,因为它已经像本示例中那样拥有它,但这仍然需要时间和精力,对于小型资源(如 CSS 或 JavaScript),它可能会有很多停止时下载。

因此,您应该只在客户很有可能需要资源时推送。 Cache-Digests 将是客户端告诉服务器它缓存了哪些资源的一种方式,从而帮助服务器决定是否推送,但它仍在进行中,如果有任何浏览器支持它,它不会消失。与此同时,我在 Apache 中完成了一个基于 cookie 的简单实现,您可能会感兴趣:https://www.tunetheweb.com/performance/http2/http2-push/

【讨论】:

  • 感谢您的回答 - 我在我的网站首页 (rgraph.net) 添加了一个 Link: 标题,但根据 Chrome 瀑布图中的 Initiator 列,未触发 style.css 的下载通过推。尽管已经说过,如果我将 Link: 标头中的 URL 更改为不存在的内容,它确实会导致 404 出现在请求列表中(在网络面板中)。所以也许它正在工作 - 也许不是。
  • 您正在使用的资产需要被页面使用。查看您的网站,您正在尝试推送 foo.css,但 1)它不存在,2)它没有在您的 html 上的任何地方引用,因此推送毫无意义。
  • 那只是一个测试。我真正想要推动的是styles.css - 所以我添加了这个PHP来添加链接头: header('Link: /styles.css>; rel=preload; as=style');标头发送正常,我可以在 Chrome 网络面板中看到 - 但发起者没有提到“推送”。
  • 现在看起来,但同意它不起作用。您使用的是哪个版本的 Apache?
  • 您的服务器支持 NPN,如 ssllabs.com/ssltest/analyze.html?d=www.rgraph.net 所示。阿帕奇没有。所以你必须在 Apache 前面有一些东西是处理 HTTP/2 的东西。它大概不支持通过链接头推送。
猜你喜欢
  • 2019-11-21
  • 2019-02-25
  • 2018-09-06
  • 2016-03-18
  • 2020-01-08
  • 1970-01-01
  • 2018-03-06
  • 2017-08-31
  • 2016-06-14
相关资源
最近更新 更多