我目前正在使用Node为动态和静态文件制作服务器。我正在尝试实现HTTP2。令我惊讶的是,似乎HTTP2推送不支持ETag!
当客户端发送标头以检索以push开头且已被接受的文件时,它将忽略“ IF-NONE-MATCH”标头。
这很浪费,我不了解这种行为的原因。是这种情况还是我错过了什么?
答案 0 :(得分:0)
如评论中所述,服务器将资源推送,因此没有客户端请求,因此也没有要发送的Etag。
因此HTTP / 2确实支持Etags-它们与推送请求无关。
是的,这确实意味着对于Pushed资源,缓存的资源将被忽略-这是Push的主要缺点之一,也是为什么许多人不建议使用它的原因。当客户端在推送资源之前看到服务器发送的PUSH_PROMISE时,它可以通过RST_STREAM请求拒绝它,但是到向服务器发送该请求时,通常大部分(如果不是全部)资源都已经被推送
有几种解决方法:
最终,HTTP / 2推送已被证明难以使用,因此使用率非常低。因此,because it is complex and there are other implication issues也很大。即使所有这些问题都得到解决,当仍然最好让浏览器按知道需要它们的顺序来请求资源时,仍然很容易过度推送资源。 Chrome团队甚至讨论过关闭它而不支持它。
许多人建议将status code 103与“早期提示”结合使用,因为它会告诉浏览器要请求什么,而不仅仅是推送请求。然后,浏览器可以使用它的所有常识(缓存中的内容,应使用的优先级等),而不必像Push那样覆盖所有这些信息。
便宜的插件,但是如果对此感兴趣,那么我的Chapter 5的recently published book会对此进行更详细的讨论,然后可以将其压缩为Stack Overflow的答案。