Http Etag和Expires标头之间的区别是什么?

Http Etag和Expires标头之间的区别是什么?,http,browser-cache,cache-control,etag,http-caching,Http,Browser Cache,Cache Control,Etag,Http Caching,我知道这个问题被问了好几次。但我仍然不清楚这个概念。在读了很多博客和答案之后,我得到的是 Expiry headers are used when you don’t even want client (and proxies/caches) to make a request to the server. In ETAG, the client will check with the server for the update, but in expiry headers, the cl

我知道这个问题被问了好几次。但我仍然不清楚这个概念。在读了很多博客和答案之后,我得到的是

Expiry headers are used when you don’t even want client (and proxies/caches) to make a request to  
the server. In ETAG, the client will check with the server for the update, but in expiry 
headers, the client will know, when to expire the file and check for an update, till then it
(browsers and proxies/caches) won’t bother server for checking the update.
因此,基本上它说如果我们使用expires/max age头,它甚至不会检查服务器是否有更新的文件。所以我想在本地测试一下

所以我创建了一个简单的html文件,包括2个js文件和1个图像文件。在IIS中,我已将图像文件夹的Expires头设置为2天。所以根据我的理解,在从服务器获取一次图像文件后,对于下一个请求,它不应该向服务器发送检查图像文件是否被修改的请求

但我得到的是,每次刷新页面时,我都会看到一个发送到服务器的请求,服务器返回一个
304 not modified
状态。但是根据我读到的规范/博客,它不应该向服务器发送请求

请有人解释一下


了解您所描述的内容

  • 很明显,
    ETag
    的工作方式与预期一样,如果没有匹配的
    字段和
    ETag
    值,则使用
    304 not modified
    响应请求

    因此,现在浏览器将从缓存中加载图像,而不是从服务器上获取新图像,这将耗费带宽和时间

  • 您的浏览器中似乎禁用了缓存。这就是为什么在缓存过期之前发送了新请求,否则一开始就不会发送请求的原因

    下面是一个精彩的例子,解释了如何通过编程在浏览器中禁用缓存

    下面是另一个精彩的例子,深入解释了缓存和Etag

注:

总的来说 如果您使用多台带有负载平衡器的服务器来托管您的网站
然后,简单的Etag配置可能会因为在其标头中包含Etag而花费更多带宽,而它没有检查浏览器缓存是否有效的目的。(它总是会说无效)

重要的部分是您所说的:我刷新页面。在这种情况下,浏览器试图为您提供新的内容,所以它除了联系服务器并检查所有资源之外别无选择。(有一个缓存控制扩展
不可变的
,它阻止了这种行为,但没有被广泛使用和实现)

如果您想查看浏览器在不重新加载的情况下尊重缓存的行为,则必须使用“标准页面输入”。跟随页面链接或使用其他选项卡将页面url写入url栏,然后按enter键


缓存尊重过期时间,所以如果文档未过期,则从缓存返回。如果ETag已过期,则用于验证资源(验证后,资源可能仍未修改-304响应)

这是否回答了您的问题?