gpt4 book ai didi

etag - 同时利用 etags 和分块编码?

转载 作者:行者123 更新时间:2023-12-04 02:12:31 28 4
gpt4 key购买 nike

更新的问题

我的应用程序如何利用 etags,引入流/分块编码是否会带来任何复杂性?

原始问题

使用 Transfer-Encoding: chunked 进行 HTTP 流传输时, Content-Length无法发送,因为它通常是未知的。

据我了解,当浏览器利用 etags 时,他们需要知道 Content-Length .如果提供了 etag 但没有提供 Content-Length , 浏览器永远不会发送 If-None-Match .

有没有解决的办法?

最佳答案

什么是实体标签?

Etags 是用于版本页面的 http header ,如果页面未更改,则允许客户端重用先前缓存的页面副本。

基本思想是客户端转到一个页面并向拥有该页面的服务器发送一个 http 请求。然后服务器呈现页面并将响应连同包含一些值的 etag 一起返回给客户端。除了显示页面之外,客户端还将在其本地缓存中归档该页面的副本以及 etag。下次客户端访问该页面时,客户端将向网络服务器发出请求,但将 etag 包含在 If-None-Match 中。标题。这种请求称为条件 GET。客户说,“我想要这个页面,但是我已经有一个带有这个 etag 值的页面缓存版本,所以如果你认为我的缓存版本是最新的,就告诉我,我只会显示我的缓存副本给用户”。

etag 值没有任何语义要求。它应该用于存储允许您确定客户端副本是否是最新的值。

最简单的方法是计算响应的散列,如果散列与请求 header 中的 etag 值匹配,则客户端已经拥有相同的副本,您可以返回 304 No content并在响应中返回一个空的正文。这比再次返回整个页面要快得多。

优化

虽然计算散列是一种确定缓存是否仍然良好的简单而安全的方法,但存在更智能的技术可以让您减少网络服务器的负载。考虑一个在网上商店中显示产品的页面。您可以只使用产品的 updated_at,而不是使用产品描述呈现页面,然后计算和比较哈希值。属性。这意味着您在应用程序中做的第一件事是检查 etag 并从数据库中获取产品以比较 updated_at属性。如果匹配,则您假定产品的详细信息未更改,并且您可以完成请求处理而无需进一步执行任何操作,然后返回 304 No content回复。

但是,您应该小心这种优化,因为页面上可能会有其他内容过时而不会影响updated_at。数据库中产品的属性。这可能是带有最新消息的侧边栏,或者更糟的是,页面的个性化部分,例如列出以前添加的产品的购物车。

分块编码

分块编码只是一种以多个块传输响应的技术,因此接收客户端可以在服务器仍在处理剩余块的同时更快地开始呈现页面。它与缓存无关。但是,如果您想使用响应的散列值作为 etag,这显然是不可能的,因为在您知道完整响应之前发送 header ,这是计算散列所必需的。

关于etag - 同时利用 etags 和分块编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19972283/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com