【问题标题】:Does the ETag header make the Cache-Control header obsolete? How to make sure Cache-Control is not harmful then?ETag 标头是否会使 Cache-Control 标头过时?那么如何确保 Cache-Control 无害呢?
【发布时间】:2019-10-03 03:12:29
【问题描述】:

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

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

Cache-Control 标头的定义(https://developer.mozilla.org/de/docs/Web/HTTP/Headers/Cache-Control):

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

所以 ETag 标头告诉浏览器为资源发送单个 HTTP 请求到服务器并询问文件哈希是否已更改。如果是,请下载一个新的。伟大的。因此,如果设置了 ETag 标头,为什么我还需要 Cache-Control(在 Expires 标头旁边可能有助于避免这个单一请求)?

所以如果我无论如何都必须设置 Cache-Control 标头,那只会是有害的,对吧?我认为最合适的值是:

Cache-Control: must-revalidate

但我不确定这是否会触发不必要的额外操作。

【问题讨论】:

    标签: http caching http-headers cache-control etag


    【解决方案1】:

    经过一番研究,我发现了 Alex Barashkov 关于Medium 的精彩教程:"Best practices for cache control settings for your website"

    亚历克斯写道:

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

    【讨论】:

      【解决方案2】:

      ETag 标头的存在不会告诉浏览器做任何事情。浏览器根据它在请求中接收到的Cache-Control 标头和缓存的响应来决定要做什么。如果它确定资源已过时或需要重新验证,那么它可以使用 ETag 值向服务器创建条件请求,并获取新资源(状态代码 200),或者通知事情已经发生未更改(状态代码 304)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-13
        • 2014-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-15
        • 2011-06-13
        • 2011-07-20
        相关资源
        最近更新 更多