Http ETag标头是否使缓存控制标头过时?那么,如何确保缓存控制不会有害呢?

Http ETag标头是否使缓存控制标头过时?那么,如何确保缓存控制不会有害呢?,http,caching,http-headers,cache-control,etag,Http,Caching,Http Headers,Cache Control,Etag,ETag头()的定义: ETag HTTP响应头是特定版本的标识符 一种资源。它可以使缓存更高效,并节省时间 带宽,因为如果需要,web服务器不需要发送完整响应 内容没有改变。另一方面,如果内容 更改后,ETag有助于防止同步更新 相互覆盖的资源(“空中碰撞”) 缓存控制头()的定义: “缓存控制常规标头”字段用于指定指令 用于请求和响应中的缓存机制 因此ETag头告诉浏览器一个资源向服务器发送一个HTTP请求,并询问文件哈希是否已更改。如果是,请下载一个新的。伟大的因此,如果设置了ETag头,

ETag头()的定义:

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

缓存控制头()的定义:

“缓存控制常规标头”字段用于指定指令 用于请求和响应中的缓存机制

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

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

Cache-Control: must-revalidate

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

经过一些研究,我发现亚历克斯·巴拉什科夫(Alex Barashkov)的一篇关于媒体的优秀教程:

亚历克斯写道:

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


出现
ETag
标题不会告诉浏览器执行任何操作。浏览器根据它在请求和缓存响应中接收的
缓存控件
头决定要执行的操作。如果它确定资源已过时或需要重新验证,那么它可以使用
ETag
值创建对服务器的条件请求,并获取新资源(状态代码200),或通知内容未更改(状态代码304)

这两个头都是缓存最佳工作所必需的