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";
}
}
我期望的设置行为是:
- max-age: 以秒为单位指定时间使用缓存
- etag:用于验证数据的新鲜度
- 私有:避免使用代理缓存来保存数据
hard-reloads 我得到了预期的行为:
1- 第一次下载命中服务器 returns 数据 200
2- 第二次刷新(ctrl + R)点击服务器以验证新鲜度,如果未修改则返回 304,如果数据已修改则返回 200。 (似乎它从未从网络缓存中提供过。为什么?)
以前的行为大多是预期的,但使用back
和forward
按钮总是从网络缓存 中检索数据。为什么是这样?为什么如果我修改了数据但使用 back
/forward
按钮我仍然从缓存中获取陈旧数据?即使我等待超过 10 秒,结果也是一样的。只是 hard-reload 将获得新数据。
缓存 header 的工作方式如下:
如果设置了 max-age 或 Expires,则资源将在提供的时间内缓存,但有一个例外,如果 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.
此外,您可以结合使用 ETag 和 max-age/Expires headers 使缓存更具质量。当时间到期时,浏览器将发送基于 ETag 的重新验证请求。
注意max-age和Expires是等价的,但是max-age 具有更高的优先级。
还有一件事,如果您没有提供任何以前的 header,那么浏览器(例如 Chrome)可以缓存您的资源 10% 的时间,因为 Last-Modified header 值,但任何方式都会根据缓存资源的 Last-Modified 值发送重新验证请求。
我正在测试 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";
}
}
我期望的设置行为是:
- max-age: 以秒为单位指定时间使用缓存
- etag:用于验证数据的新鲜度
- 私有:避免使用代理缓存来保存数据
hard-reloads 我得到了预期的行为:
1- 第一次下载命中服务器 returns 数据 200
2- 第二次刷新(ctrl + R)点击服务器以验证新鲜度,如果未修改则返回 304,如果数据已修改则返回 200。 (似乎它从未从网络缓存中提供过。为什么?)
以前的行为大多是预期的,但使用back
和forward
按钮总是从网络缓存 中检索数据。为什么是这样?为什么如果我修改了数据但使用 back
/forward
按钮我仍然从缓存中获取陈旧数据?即使我等待超过 10 秒,结果也是一样的。只是 hard-reload 将获得新数据。
缓存 header 的工作方式如下:
如果设置了 max-age 或 Expires,则资源将在提供的时间内缓存,但有一个例外,如果 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.
此外,您可以结合使用 ETag 和 max-age/Expires headers 使缓存更具质量。当时间到期时,浏览器将发送基于 ETag 的重新验证请求。
注意max-age和Expires是等价的,但是max-age 具有更高的优先级。
还有一件事,如果您没有提供任何以前的 header,那么浏览器(例如 Chrome)可以缓存您的资源 10% 的时间,因为 Last-Modified header 值,但任何方式都会根据缓存资源的 Last-Modified 值发送重新验证请求。