【问题标题】:Cache-Control headers, max-age defined but back button always deliver web cache dataCache-Control 标头,定义了 max-age 但后退按钮始终提供 Web 缓存数据
【发布时间】:2016-07-01 10:57:57
【问题描述】:

我正在测试 cache-control 标头在 Chrome 上的工作方式。 我在nginx 中的设置非常简单:

server {
    listen       80;
    server_name  localhost;

    etag        on;
    root        /usr/share/nginx/html;

    location / {
        add_header Cache-Control "must-revalidate, private, max-age=10";
    } 
}

我期望的设置行为是:

  • max-age:在指定时间内使用缓存(以秒为单位)
  • etag:用于验证数据的新鲜度
  • private:避免使用代理缓存来保存数据

通过硬重新加载,我得到了预期的行为:

1- 第一次下载到服务器,返回数据为200

2- 第二次刷新(ctrl + R)访问服务器以验证新鲜度,如果未修改,则返回 304,如果数据已修改,则返回 200。 (似乎它从未从网络缓存中提供过。为什么?)

之前的行为大多是预期的,但使用backforward 按钮总是从网络缓存中检索数据。为什么是这样?为什么如果我修改了数据但使用back/forward 按钮我仍然从缓存中获取陈旧数据?即使我等待超过 10 秒,结果也是一样的。只需硬重新加载即可获得新数据。

【问题讨论】:

    标签: google-chrome caching nginx cache-control


    【解决方案1】:

    缓存标头的工作方式如下:

    如果设置了 ma​​x-ageExpires,那么如果 Cache-Control 包含必须重新验证然后会发生以下情况。

    因为缓存可以配置为忽略服务器指定的过期时间,并且因为客户端请求可以包含 maxstale 指令(具有类似的效果),所以协议还包括源服务器要求重新验证的机制任何后续使用的缓存条目。当缓存接收到的响应中存在 must-revalidate 指令时,缓存不能在条目变得陈旧后使用该条目来响应 后续请求,而无需先使用源服务器重新验证它。

    或者如果 Cache-Control 包含 no-cache 则会发生以下情况。

    如果 no-cache 指令未指定字段名称,则缓存不得使用响应来满足后续请求,而无需与源服务器成功重新验证。

    此外,您可以结合 ETagma​​x-age/Expires 标头来使缓存更加定性。当时间到期时,浏览器将发送基于 ETag 的重新验证请求。

    请注意,ma​​x-ageExpires 是等效的,但 ma​​x-age 具有更高的优先级。

    还有一件事,如果您没有提供任何以前的标头,那么浏览器(例如 Chrome)可以在 Last-Modified 标头值之后的 10% 时间内缓存您的资源,但任何方式都会根据缓存资源的 Last-Modified 值发送重新验证请求。

    【讨论】:

    • 在图片中你可以看到我使用的是 max-age。仍然是所示的行为。 Max-age 似乎对从缓存中提供文件没有任何影响。我是否在这些请求或响应中遗漏了一些 cschr-control 设置?
    • 你有 ETag,它承担了发送条件请求的所有责任。你能详细说明一下,你到底想达到什么目标?
    • 可以使用cache-control: max-age 结合etag 吗?这有什么意义吗?我认为它会从 10 秒(基于 max-age)开始从缓存中提供文件,并且当超过 10 秒不请求文件时,它会执行条件请求以检查资源/文件的新鲜度。
    • @kitimenpolku:我已经修改了我的答案,希望它能解决你的问题
    • 看看这个谷歌字体问题:github.com/google/fonts/issues/367 Expires [now] 似乎取代了 Cache-Control max-age=86400
    猜你喜欢
    • 2011-12-08
    • 2020-08-11
    • 2015-10-19
    • 2012-06-30
    • 2018-03-11
    • 2018-03-14
    • 2014-07-31
    • 2015-04-08
    • 2017-03-21
    相关资源
    最近更新 更多