Cache-Control标头,已定义max-age但后退按钮始终提供Web缓存数据

时间:2016-03-15 19:51:45

标签: google-chrome caching nginx cache-control

我正在测试instancetype标头在Chrome上的工作原理。 我在instancetype中的设置非常简单:

cache-control

我期望进行设置的行为是:

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

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

1- 首先下载到服务器并返回200

的数据

enter image description here

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

enter image description here

以前的行为主要是预期的,但使用nginxserver { listen 80; server_name localhost; etag on; root /usr/share/nginx/html; location / { add_header Cache-Control "must-revalidate, private, max-age=10"; } } 按钮始终从网络缓存中检索数据。为什么是这样?为什么我修改数据但使用back / forward按钮我仍然从缓存中获取陈旧数据?即使我等待超过10秒,结果也是一样的。只需重新加载即可获得新数据。

enter image description here

1 个答案:

答案 0 :(得分:3)

缓存标头按以下方式工作:

如果设置了 max-age Expires ,那么资源将被缓存一段时间,如果 Cache-Control 包含一个例外必须重新验证然后会发生以下情况。

  

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

如果缓存控制包含无缓存,则会发生以下情况。

  

如果no-cache指令没有指定字段名,那么高速缓存绝不能使用响应来满足后续请求,而不能与源服务器成功重新验证。

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

请注意, max-age Expires 相同,但 max-age 具有更高的优先级。

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