If-None-Match请求头是否优先于Cache-Control: max-age缓存控制?

4

我有一个Web应用程序,提供一张图片:

enter image description here

我明确地设置了 Cache-Control 头,Web 服务器设置了 Etag。问题在于每次都会对资源进行 If-None-Match 匹配,有效地忽略了 Cache-Control 头。(框架相应返回 304,但往返仍存在)。 我阅读到 Etag 头可能会覆盖 Cache-Control,即使资源是本地且有效的也会去检查匹配。这对我来说没有意义。
有人知道发生了什么吗?我错过了什么?
附:Web 服务器是 Play! 应用程序。
2个回答

4

终于搞定了。一些浏览器(如Google Chrome和Firefox)会在使用CMD+R或F5重新加载页面时忽略本地缓存。

在我的情况下,无论我将最大年龄设置多高,页面重新加载将始终强制进行If-None-Match检查并返回304。通过点击链接浏览网站不会触发此行为,缓存也可以正常工作。

注意:我之前没有注意到这一点,因为在单个页面webapp(如我的应用程序)中没有“链接点击导航”,因为大部分页面都是在开始时加载的。


如果有人会看到这个:今天的Chrome版本(57.x)即使在浏览器URL中按下“Enter”键,也会发送max-age:0If-None-Match。与按下“F5”时的操作相同。因此,无法再通过这种方式测试缓存。请参见评论 - Ruslan Stelmachenko

2
你可能受到代理的影响。 max-age 指令是为浏览器设计的,而 s-maxage 指令是为代理服务器设计的。
你的 Cache-Control 头中似乎缺少 s-maxage 指令。
你可能还想添加 public 指令。(尽管根据规范,这应该是默认的,但显式设置不会有害) http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3 此外,请记住,一些代理服务器可能会选择忽略所有这些设置,因此即使你在自己的端上完美配置了所有内容,也无法完全停止接收请求。
我在为 CDN 服务的图像服务中设置了所有三个指令(也使用了 ETag 和 Last-Modified),在测试中没有注意到异常行为。

嗨,谢谢你的回答。忘了提到这甚至发生在我的开发机器上,本地主机上显然没有代理涉及。 - Pablo Fernandez
1
这是赏金。感谢您抽出时间提供答案。 - Pablo Fernandez

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