Etag和Expires标头有什么区别?

时间:2014-11-20 02:13:23

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

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

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状态。但是根据我阅读的规格/博客,它不应该向服务器发送请求。

有人请解释。

enter image description here

2 个答案:

答案 0 :(得分:3)

对于你所描述的内容

  • 很明显,ETag可以通过304 not modifiedIf-None-Match字段和ETag值的请求进行回复来实现预期效果。

    所以现在浏览器将从缓存中加载图像,而不是从服务器获取带来带宽和时间的新图像。

  • 似乎在浏览器中禁用了缓存。这就是为什么在缓存过期之前发送了新请求,否则首先不会发送请求。

    这是一个很棒的article,它解释了如何在编程器中以编程方式禁用缓存

    这是另一个精彩的article,可以深入解释缓存 Etag

注意:

一般来说 如果您使用多个服务器负载均衡器来托管您的网站 那么简单的Etag配置可能会通过在标题中包含Etag而花费更多带宽,并且没有任何目的来检查浏览器缓存是否有效。(它总是会说无效)

答案 1 :(得分:0)

重要的部分就是你所说的:我刷新页面。在这种情况下,浏览器正在尝试为您提供新鲜内容,因此除了联系服务器并检查所有资源之外别无选择。 (缓存控制扩展immutable可以防止此行为,但未广泛使用和实现)。

如果您想要查看浏览器的行为而不重新加载尊重缓存,则必须使用"标准页面条目"。请点击页面链接或使用其他标签页并将页面网址写入网址栏并按Enter键。

缓存尊重到期时间,因此如果文档不是陈旧的,则从缓存中返回。如果过期,ETag用于验证资源(并且在验证之后,资源可能仍未被修改 - 304响应)