我有一个提供图像的webapp:
我已正确设置Cache-Control
标头,并且网络服务器正在设置Etag
。
问题在于资源每次都If-None-Match
有效地忽略了Cache-Control
标头。 (框架相应地返回304但是存在往返)。
I've read Etag
标头可能会否决Cache-Control
,即使资源是本地有效的,仍会检查匹配。这对我来说毫无意义。
任何人都知道发生了什么?我在这里错过了什么?
PD:网络服务器是Play!应用
答案 0 :(得分:2)
您可能会受到代理人的攻击。</ p>
max-age
指令适用于浏览器,而s-maxage
指令适用于代理。
您似乎错过了Cache-Control标头中的s-maxage指令。
您可能还想添加public
directive。 (即使根据规范,这应该是默认值,明确设置也没有坏处)
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3
另外,请记住,某些代理可能会选择忽略所有这些,因此即使您已完成所有内容的配置,也不会完全停止接收请求。
我在服务中设置了所有3个指令,为CDN提供图像(也使用ETag和Last-Modified),我没有注意到我的测试中的异常行为。
答案 1 :(得分:2)
终于明白了。当您使用CMD + R或F5重新加载页面时,某些浏览器(肯定是Google Chrome和Firefox)会忽略本地缓存。
就我而言,无论我设置max-age有多高,页面重新加载都会强制If-None-Match
检查并返回304。通过单击链接浏览网站不会触发此行为,缓存也可以正常工作。
注意:我没有注意到这一点,因为在单页webapp(像我的)中没有“链接点击导航”,因为大多数都是在开头加载。