HTTP:ETag标头是否会使Cache-Control标头过时?那么如何确保Cache-Control不会有害呢?

时间:2019-03-06 14:53:30

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

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标头,为什么我还需要缓存控制(在Expires标头旁边,这可能有助于避免此单个请求)?

因此,如果我仍然必须设置Cache-Control标头,那只会是有害的吧?我认为最合适的值是:

Cache-Control: must-revalidate

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

2 个答案:

答案 0 :(得分:1)

经过研究,我发现了Alex Barashkov撰写的有关 Medium 的出色教程:"Best practices for cache control settings for your website"

亚历克斯写道:

  

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

答案 1 :(得分:0)

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

两个标题都是您的缓存最佳工作所必需的。