HTTP2尚不支持etag?

时间:2019-05-15 16:55:48

标签: http2 etags

我目前正在使用Node为动态和静态文件制作服务器。我正在尝试实现HTTP2。令我惊讶的是,似乎HTTP2推送不支持ETag!

当客户端发送标头以检索以push开头且已被接受的文件时,它将忽略“ IF-NONE-MATCH”标头。

这很浪费,我不了解这种行为的原因。是这种情况还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

如评论中所述,服务器将资源推送,因此没有客户端请求,因此也没有要发送的Etag。

因此HTTP / 2确实支持Etags-它们与推送请求无关。

是的,这确实意味着对于Pushed资源,缓存的资源将被忽​​略-这是Push的主要缺点之一,也是为什么许多人不建议使用它的原因。当客户端在推送资源之前看到服务器发送的PUSH_PROMISE时,它可以通过RST_STREAM请求拒绝它,但是到向服务器发送该请求时,通常大部分(如果不是全部)资源都已经被推送

有几种解决方法:

  1. 例如,您可以使用cookie跟踪已推送的内容。我这里有一个使用Apache配置的简单示例:https://www.tunetheweb.com/performance/http2/http2-push/。当然,我们假设Cookie和缓存是同步的,但它们可能不是同步的(它们可以独立清除)。
  2. 某些服务器跟踪已推送的内容。 Apache例如allows an HTTP/2 push diary to be configured(默认设置为256个项目),它跟踪在该连接上推送的项目。如果您访问page1.html并推送了styles.css,然后又访问了page2.html并尝试推送了styles.css,Apache将不会推送它,因为它知道您已经拥有了它。但是,仅在使用相同的连接时才有效。您稍后会重新建立新连接,但它仍在缓存中,然后将其重新推送。
  3. 有一个针对Cache digests的提案,该提案允许浏览器在任何连接开始时发送缓存中内容的编码列表,服务器可以使用该列表来了解是否推送项目或不。不过,work on that has been stopped最近因为对此存在一些隐私问题。

最终,HTTP / 2推送已被证明难以使用,因此使用率非常低。因此,because it is complex and there are other implication issues也很大。即使所有这些问题都得到解决,当仍然最好让浏览器按知道需要它们的顺序来请求资源时,仍然很容易过度推送资源。 Chrome团队甚至讨论过关闭它而不支持它。

许多人建议将status code 103与“早期提示”结合使用,因为它会告诉浏览器要请求什么,而不仅仅是推送请求。然后,浏览器可以使用它的所有常识(缓存中的内容,应使用的优先级等),而不必像Push那样覆盖所有这些信息。

便宜的插件,但是如果对此感兴趣,那么我的Chapter 5recently published book会对此进行更详细的讨论,然后可以将其压缩为Stack Overflow的答案。