If-None-Match标头是否会覆盖Cache-Control:max-age?

时间:2014-06-10 21:54:20

标签: playframework cache-control etag if-none-match

我有一个提供图像的webapp:

enter image description here

我已正确设置Cache-Control标头,并且网络服务器正在设置Etag

问题在于资源每次都If-None-Match 有效地忽略了Cache-Control标头。 (框架相应地返回304但是存在往返)。

I've read Etag标头可能会否决Cache-Control,即使资源是本地有效的,仍会检查匹配。这对我来说毫无意义。

任何人都知道发生了什么?我在这里错过了什么?

PD:网络服务器是Play!应用

2 个答案:

答案 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(像我的)中没有“链接点击导航”,因为大多数都是在开头加载。