Etag和Expires头部之间有什么区别?

6

我知道这个问题已经被问了很多次。但是,我对这个概念还不是很清楚。在阅读了许多博客和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未修改”状态。 但是根据我阅读的规格/博客,它不应该向服务器发送请求。
请有人解释一下。

这个回答解决了您的问题吗?[ETag与Header Expires] (https://dev59.com/rXRB5IYBdhLWcg3wz6ed) - Channa
2个回答

3

根据您所描述的情况:

  • 很明显,ETag 的作用与预期相符,在请求中包含 If-None-Match 字段和 ETag 值时,响应 304 not modified

    因此,现在浏览器将从缓存中加载图像,而不是从服务器获取新图像,这样可以节省带宽和时间。

  • 看起来您的浏览器已禁用缓存。因此,在缓存过期之前发送了新请求,否则首先不会发送请求。

    这里有一篇精彩的文章,介绍了如何通过程序找到浏览器是否禁用了缓存。

    这里还有一篇精彩的文章,深入解释了cachingEtag

注意:

一般来说,如果您使用多个服务器负载均衡器来托管您的网站,则简单的 Etag 配置可能会通过在其标头中添加 Etag 来消耗更多的带宽,而这没有任何目的,只是检查浏览器缓存是否有效。(它总是会说无效)


0
重要的部分是你所说的:“我刷新了页面”。在这种情况下,浏览器试图提供给你最新的内容,因此除了与服务器联系并检查所有资源之外别无选择。(有一个缓存控制扩展名叫做“immutable”,可以防止这种行为,但并不广泛使用和实施)。
如果你想看到你的浏览器在不重新加载的情况下遵守缓存的行为,你必须使用“标准页面入口”。要么通过链接进入页面,要么使用另一个标签页,在地址栏中输入页面的URL并按回车键。
缓存会尊重过期时间,所以如果文档没有过时,它将从缓存中返回。如果过期了,那么ETag将用于验证资源(验证后可能仍然未修改-304响应)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接