Cache-Control headers、max-age 已定义但后退按钮始终传送网络缓存数据

Cache-Control headers, max-age defined but back button always deliver web cache data

我正在测试 cache-control header 如何在 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";
    } 
}

我期望的设置行为是:

hard-reloads 我得到了预期的行为:

1- 第一次下载命中服务器 returns 数据 200

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

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

缓存 header 的工作方式如下:

如果设置了 max-ageExpires,则资源将在提供的时间内缓存,但有一个例外,如果 Cache-Control 包含 must-revalidate 然后会发生以下情况。

Because a cache MAY be configured to ignore a server's specified expiration time, and because a client request MAY include a max- stale directive (which has a similar effect), the protocol also includes a mechanism for the origin server to require revalidation of a cache entry on any subsequent use. When the must-revalidate directive is present in a response received by a cache, that cache MUST NOT use the entry after it becomes stale to respond to a subsequent request without first revalidating it with the origin server.

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

If the no-cache directive does not specify a field-name, then a cache MUST NOT use the response to satisfy a subsequent request without successful revalidation with the origin server.

此外,您可以结合使用 ETagmax-age/Expires headers 使缓存更具质量。当时间到期时,浏览器将发送基于 ETag 的重新验证请求。

注意max-ageExpires是等价的,但是max-age 具有更高的优先级。

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