我testing如何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"; } }
我期待的设置行为是:
随着硬重新加载我得到预期的行为:
1- 首先下载到服务器并用200返回数据
2- 第二次刷新(ctrl + R)命中服务器validation新鲜度,如果没有修改则返回304;如果数据被修改,则返回200。 (它似乎从来没有从Webcaching服务,为什么?)
以前的行为大多是预期的,但使用back
和forward
button总是从Webcaching中检索数据 。 为什么是这样? 为什么如果我修改数据,但使用back
/ forward
button我仍然从caching中得到陈旧的数据? 即使等了十多秒,结果也是一样的。 只需重新加载就可以获得新的数据。
缓存标题的工作方式如下:
如果max-age或Expires被设置,那么资源将被缓存提供的时间,只有一个例外,如果Cache-Control包含must-revalidate,则会发生以下情况。
由于缓存可能被配置为忽略服务器指定的过期时间,并且因为客户端请求可能包含最大化指令(具有类似的效果),所以该协议还包括原始服务器需要重新验证缓存的机制进入任何后续使用。 当必须重新生效的指令存在于缓存接收到的响应中时,该缓存不应该使用该条目,而是在其不再使用该条目来响应后续的请求,而不必先用原始服务器对其进行重新验证。
或者如果Cache-Control包含no-cache,则会发生以下情况。
如果no-cache指令没有指定一个字段名,那么缓存不能使用响应来满足后续的请求,而不需要对源服务器进行成功的重新验证。
另外,您可以将ETag和max-age / Expires标头结合起来,使缓存更加定性。 当时间到期时,浏览器将发送基于ETag的重新验证请求。
请注意, max-age和Expires是等价的,但max-age具有更高的优先级。
还有一件事,如果你没有提供任何以前的标题,那么浏览器(例如Chrome)可以缓存你的资源的时间从Last-Modified标题值的10%,但任何方式将发送基于Last的重新验证请求–缓存资源的修改值。