HTTP2 还不支持etags?
HTTP2 does not yet support etags?
我目前正在使用 Node.js 为动态和静态文件制作一个服务器。我正在尝试实施 HTTP2。让我意外的是HTTP2推送好像不支持ETags!
当客户端发送 headers 来检索以推送开头的文件并且它已接受时,它会忽略 "IF-NONE-MATCH" header.
太浪费了,我不明白这种行为的原因。是这种情况还是我遗漏了什么?
如评论中所述服务器推送资源,因此没有客户端请求,因此没有要发送的Etag。
所以 HTTP/2 确实支持 Etags - 它们只是与推送的请求无关。
是的,这确实意味着缓存资源将被推送资源忽略 - 这是推送的一大缺点,也是许多人不建议使用它的原因。当客户端在推送资源之前看到服务器发送的 PUSH_PROMISE 时,它可以使用 RST_STREAM 请求拒绝它,但是到服务器时通常是一个很好的部分(如果不是全部)的资源将已被推送。
有几种解决方法:
- 例如,您可以使用 cookie 跟踪已推送的内容。我在这里有一个使用 Apache 配置的简单示例:https://www.tunetheweb.com/performance/http2/http2-push/。当然,假设 cookie 和缓存是同步的,但它们可能不同步(它们可以独立清除)。
- 有些服务器会跟踪已推送的内容。例如 Apache allows an HTTP/2 push diary to be configured(默认设置为 256 个项目),它跟踪在该连接上推送的项目。如果您访问 page1.html 并且它推送 styles.css,然后您访问 page2.html 并且它还尝试推送 styles.css Apache 不会推送它,因为它知道您已经拥有它。但是,这仅在您使用相同的连接时才有效。如果您稍后通过新连接返回,但它仍在缓存中,那么它将是 re-pushed.
- 最近有人提出了 Cache digests, which allow the browser to send an encoded list of what is in the cache at the start of any connection, and the server could use that to know whether to push an item or not. However work on that has been stopped 的提议,因为对此存在一些隐私问题。
最终 HTTP/2 事实证明,推送很难发挥作用,因此它的使用率非常低。这在很大程度上是由于此,而且 because it is complex and there are other implication issues。即使所有这些都已解决,当最好让浏览器按照它知道需要它们的顺序请求资源时,仍然很容易过度推送资源。 Chrome 团队甚至谈到要关闭它而不支持它。
许多人建议使用 status code 103 的早期提示,因为它告诉浏览器要请求什么,而不是仅仅推送它。浏览器然后可以使用它所有的常识(缓存中有什么,应该以什么优先级请求...等等)而不是像 Push 那样覆盖所有这些。
便宜的插件,但如果对此感兴趣,那么 Chapter 5 of my recently published book 将对此进行更详细的讨论,然后可以在 Stack Overflow 上找到答案。
我目前正在使用 Node.js 为动态和静态文件制作一个服务器。我正在尝试实施 HTTP2。让我意外的是HTTP2推送好像不支持ETags!
当客户端发送 headers 来检索以推送开头的文件并且它已接受时,它会忽略 "IF-NONE-MATCH" header.
太浪费了,我不明白这种行为的原因。是这种情况还是我遗漏了什么?
如评论中所述服务器推送资源,因此没有客户端请求,因此没有要发送的Etag。
所以 HTTP/2 确实支持 Etags - 它们只是与推送的请求无关。
是的,这确实意味着缓存资源将被推送资源忽略 - 这是推送的一大缺点,也是许多人不建议使用它的原因。当客户端在推送资源之前看到服务器发送的 PUSH_PROMISE 时,它可以使用 RST_STREAM 请求拒绝它,但是到服务器时通常是一个很好的部分(如果不是全部)的资源将已被推送。
有几种解决方法:
- 例如,您可以使用 cookie 跟踪已推送的内容。我在这里有一个使用 Apache 配置的简单示例:https://www.tunetheweb.com/performance/http2/http2-push/。当然,假设 cookie 和缓存是同步的,但它们可能不同步(它们可以独立清除)。
- 有些服务器会跟踪已推送的内容。例如 Apache allows an HTTP/2 push diary to be configured(默认设置为 256 个项目),它跟踪在该连接上推送的项目。如果您访问 page1.html 并且它推送 styles.css,然后您访问 page2.html 并且它还尝试推送 styles.css Apache 不会推送它,因为它知道您已经拥有它。但是,这仅在您使用相同的连接时才有效。如果您稍后通过新连接返回,但它仍在缓存中,那么它将是 re-pushed.
- 最近有人提出了 Cache digests, which allow the browser to send an encoded list of what is in the cache at the start of any connection, and the server could use that to know whether to push an item or not. However work on that has been stopped 的提议,因为对此存在一些隐私问题。
最终 HTTP/2 事实证明,推送很难发挥作用,因此它的使用率非常低。这在很大程度上是由于此,而且 because it is complex and there are other implication issues。即使所有这些都已解决,当最好让浏览器按照它知道需要它们的顺序请求资源时,仍然很容易过度推送资源。 Chrome 团队甚至谈到要关闭它而不支持它。
许多人建议使用 status code 103 的早期提示,因为它告诉浏览器要请求什么,而不是仅仅推送它。浏览器然后可以使用它所有的常识(缓存中有什么,应该以什么优先级请求...等等)而不是像 Push 那样覆盖所有这些。
便宜的插件,但如果对此感兴趣,那么 Chapter 5 of my recently published book 将对此进行更详细的讨论,然后可以在 Stack Overflow 上找到答案。