【问题标题】:Does If-None-Match header overrules Cache-Control: max-age?If-None-Match 标头是否会否决 Cache-Control: max-age?
【发布时间】:2014-07-31 20:03:17
【问题描述】:

我有一个提供图片的网络应用:

我清楚地正确设置了Cache-Control 标头,而网络服务器正在设置Etag

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

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

有人知道发生了什么吗?我在这里想念什么?

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

【问题讨论】:

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


    【解决方案1】:

    终于明白了。当您使用 CMD+R 或 F5 重新加载页面时,某些浏览器(肯定是 Google Chrome 和 Firefox)会忽略本地缓存。

    在我的情况下,无论我将 max-age 设置得有多高,重新加载页面总是会强制检查 If-None-Match 并返回 304。通过单击链接浏览网站不会触发此行为,并且缓存可以正常工作。

    注意:我没有注意到这一点,因为在单页 web 应用程序(如我的)中没有“链接点击导航”,因为它们中的大多数都是在开始时加载的。

    【讨论】:

    • 如果有人会读到:今天的 Chrome (57.x) 版本确实发送 max-age:0If-None-Match 即使在浏览器 URL 中点击 Enter 键...它在点击F5 时有效。因此无法再以这种方式测试缓存。见the comment
    【解决方案2】:

    你可能会被代理攻击。

    max-age 指令适用于浏览器,而s-maxage 指令适用于代理。

    您的 Cache-Control 标头中似乎缺少 s-maxage 指令。

    您可能还想添加public directive。 (尽管根据规范这应该是默认值,但明确设置它并没有什么坏处)

    http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3

    另外,请记住,某些代理很可能会选择忽略所有这些,因此即使您已完美配置所有内容,您也不会完全停止接收请求。

    我在为 CDN 提供图像(也使用 ETag 和 Last-Modified)的服务中设置了所有 3 个指令,我在测试中没有注意到异常行为。

    【讨论】:

    • 您好,感谢您的回答。忘了说即使在我的开发机器上,在本地主机上,这也正在发生,显然没有涉及代理。
    • 这是赏金。感谢您抽出宝贵时间提供答案。
    猜你喜欢
    • 2012-06-30
    • 2022-01-22
    • 2011-12-08
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 2020-03-08
    相关资源
    最近更新 更多