我有一个Web应用程序,提供一张图片:
Cache-Control
头,Web 服务器设置了 Etag
。问题在于每次都会对资源进行 If-None-Match
匹配,有效地忽略了 Cache-Control
头。(框架相应返回 304,但往返仍存在)。
我阅读到 Etag
头可能会覆盖 Cache-Control
,即使资源是本地且有效的也会去检查匹配。这对我来说没有意义。有人知道发生了什么吗?我错过了什么?
附:Web 服务器是 Play! 应用程序。
我有一个Web应用程序,提供一张图片:
Cache-Control
头,Web 服务器设置了 Etag
。问题在于每次都会对资源进行 If-None-Match
匹配,有效地忽略了 Cache-Control
头。(框架相应返回 304,但往返仍存在)。
我阅读到 Etag
头可能会覆盖 Cache-Control
,即使资源是本地且有效的也会去检查匹配。这对我来说没有意义。终于搞定了。一些浏览器(如Google Chrome和Firefox)会在使用CMD+R或F5重新加载页面时忽略本地缓存。
在我的情况下,无论我将最大年龄设置多高,页面重新加载将始终强制进行If-None-Match
检查并返回304。通过点击链接浏览网站不会触发此行为,缓存也可以正常工作。
注意:我之前没有注意到这一点,因为在单个页面webapp(如我的应用程序)中没有“链接点击导航”,因为大部分页面都是在开始时加载的。
max-age
指令是为浏览器设计的,而 s-maxage
指令是为代理服务器设计的。public
指令。(尽管根据规范,这应该是默认的,但显式设置不会有害)
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3
此外,请记住,一些代理服务器可能会选择忽略所有这些设置,因此即使你在自己的端上完美配置了所有内容,也无法完全停止接收请求。
max-age:0
和If-None-Match
。与按下“F5”时的操作相同。因此,无法再通过这种方式测试缓存。请参见评论。 - Ruslan Stelmachenko