ETag 标头是否会使 Cache-Control 标头变得过时?那么如何确保Cache-Control不会造成危害呢?

Bla*_*bam 15 etag caching http cache-control http-headers

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

Bla*_*bam 18

经过一番研究,我在Medium上发现了Alex Barashkov 写的一篇很棒的教程:“网站缓存控制设置的最佳实践”

\n\n

亚历克斯写道:

\n\n
\n

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

\n
\n


Arc*_*n B 17

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

这两个标头对于缓存的最佳工作都是必需的。