我目前正在使用 Node.js 为动态和静态文件制作服务器。我正在尝试实现 HTTP2。让我吃惊的是,HTTP2 推送似乎不支持 ETags!
当客户端发送标头以检索以推送开头并已接受的文件时,它会忽略“IF-NONE-MATCH”标头。
这是一种浪费,我不明白这种行为的原因。是这种情况还是我错过了什么?
正如评论中所讨论的,服务器推送资源,所以没有客户端请求,所以没有 Etag 发送。
所以 HTTP/2 确实支持 Etags——它们只是与推送请求无关。
是的,这确实意味着对于 Pushed 资源会忽略缓存资源——这是 Push 的一大缺点,也是为什么很多人不建议使用它的原因。当客户端在推送资源之前看到服务器发送的 PUSH_PROMISE 时,它可以使用 RST_STREAM 请求拒绝它,但到将其发送到服务器时,通常大部分(如果不是全部)资源已经被推送.
有几种方法可以解决这个问题:
最终,事实证明 HTTP/2 Push 很难发挥作用,因此它的使用率非常低。很大程度上是因为这个,也因为它很复杂,还有其他的隐含问题。即使所有这些都解决了,当最好让浏览器按照它知道需要它们的顺序请求资源时,仍然很容易过度推送资源。Chrome 团队甚至讨论过关闭它而不支持它。
许多人建议使用状态码为 103的早期提示,因为它告诉浏览器请求什么,而不仅仅是推送它。然后浏览器可以使用所有它通常的知识(缓存中有什么,应该以什么优先级请求它......等等),而不是像 Push 那样覆盖所有这些。
便宜的插件,但如果对此感兴趣,那么我最近出版的书的第 5 章会更详细地讨论这一切,然后可以挤进 Stack Overflow 上的答案。