当前位置: 首页 > 知识库问答 >
问题:

ETag 标头是否使缓存控制标头过时?那么如何确保缓存控制是无害的呢?

柴赞
2023-03-14

ETag标题的定义(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag):

ETag HTTP响应头是资源的特定版本的标识符。它使缓存更有效,并节省带宽,因为如果内容没有改变,web服务器不需要发送完整的响应。另一方面,如果内容已经改变,etags有助于防止资源的同时更新互相覆盖(“空中冲突”)。

缓存控制头的定义(https://developer . Mozilla . org/de/docs/Web/HTTP/Headers/Cache-Control):

Cache-Control常规头字段用于指定请求和响应中缓存机制的指令。

因此,ETag头告诉浏览器某个资源向服务器发送单个HTTP请求,并询问文件哈希是否已更改。如果是,请下载一个新的。太棒了那么,如果设置了ETag头,为什么我还需要Cache-Control(除了Expires头之外,它可能有助于避免这个单一请求)?

所以如果我必须设置缓存控制头,这只会是有害的,对吗?我认为最合适的值是:

Cache-Control: must-revalidate

但我不确定这是否触发了不必要的额外行动。

共有2个答案

贺博厚
2023-03-14

存在ETag头不会告诉浏览器做任何事情。浏览器根据它在请求和缓存响应中收到的Cache-Control头决定执行什么操作。如果它决定资源过时或需要重新验证,则可以使用ETag值创建对服务器的有条件请求,然后获取新资源(状态代码200)或通知内容没有更改(状态代码304)

这两个标头都是您的缓存以最佳方式工作所必需的。

东和怡
2023-03-14

经过一些研究,我找到了Alex Barashkov关于Medium的一个很棒的教程:“网站缓存控制设置的最佳实践”。

亚历克斯写道:

我建议您将< code > Cache-Control:no-Cache 应用于html文件。应用“无缓存”并不意味着根本没有缓存,它只是告诉浏览器在使用缓存中的资源之前验证服务器上的资源。这就是为什么我们需要将它与Etag一起使用,因此浏览器将发送一个简单的请求并加载额外的80个字节来验证文件的状态。

 类似资料:
  • 我有一个问题与超文本传输协议头-缓存控制:max-age=1234我的源有那个头,但任何方式发送请求和接收304.我需要可能我错过了什么?还有一个,源除了缓存控制: max-age=1234在"响应头"有缓存控制: max-age=0在"请求头",可能是它的影响。 我的一个资源响应标题,示例: > 远程地址:10.6.237.13:443请求请求方式:GET状态码:304未修改

  • 我想在缓存控制头中设置max age以响应。我已经写了如下,但仍然有max-age 0。我想只为一种方法设置max age,所以我不想禁用默认值。我认为应该是ovveride。 有人知道我做错了什么吗?

  • 我们已经配置nginx服务器添加缓存控制头到公共和到期时间到1个月。但是当我们从浏览器发出请求时,客户端正在添加缓存控制:无缓存头。正因为如此,它每次都是新鲜下载内容,而不是提供缓存版本。 我怎样才能缓存静态文件? 如果我从终端触发请求,服务器添加的缓存控制标头在响应标头中可见。

  • 在nginx中使用add_header指令时,会将该头添加到来自源服务器的响应中。 假设源服务器返回缓存控制公共,最大年龄=60。但在nginx反向代理位置中,您可以设置如下内容: 添加\u头缓存控制公用,最大年龄=10 这到底是做什么的?我可以想到两种不同的情况: 1)Nginx尊重来自源服务器的缓存控制报头,并将内容存储在其缓存中,过期时间为60秒。然后传递带有覆盖标头的响应,导致客户端将资源

  • 从本月初(2021年9月)开始,我们正在构建的网络应用程序断断续续地开始显示错误页面。我们已经追踪到与HTTP响应缓存相关的问题,但是我们在那段时间内对代码所做的更改都没有包含与之相关的更改,所以我们怀疑这是由Chromium93更新引起的。 93版Chromium有任何已知问题吗?

  • 我在维基百科上读到语用标头,上面写着: “pragma:no-cache header字段是用于请求的HTTP/1.0标头。它是浏览器告诉服务器和任何中间缓存它需要资源的新版本的一种方法,而不是服务器告诉浏览器不要缓存资源。一些用户代理在响应中确实会注意此标头,但HTTP/1.1 RFC特别警告不要依赖此行为。” 但我不明白它是干什么的?值为的标头和值也为的之间有什么区别?