HTTP max-age 是如何工作的以及如何在一段时间后使缓存过期?

How does HTTP max-age works and how to expire cache after some time?

我在我的应用程序中管理 HTTP 缓存。而且它没有像我认为的那样工作。让我们来看一个实际的例子:

在我的 PHP 页面的第一个服务中,我提供以下 HTTP headers:

HTTP/1.1 200 OK
Date: Mon, 12 Dec 2016 16:39:33 GMT
Server: Apache/2.4.9 (Win64) PHP/5.5.12
Expires: Tue, 01 Jan 1980 19:53:00 GMT
Cache-Control: private, max-age=60, pre-check=60
Last-Modified: Mon, 12 Dec 2016 15:57:25 GMT
Etag: "a2883c859ce5c8153d65a4e904c40a79"
Content-Language: en
Content-Length: 326
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

我的应用程序管理 Etag 的验证并在没有任何变化时发送 304,当您在浏览器中刷新页面 (F5) 时,您会得到(如果服务器端没有任何变化):

HTTP/1.1 304 Not Modified
Date: Mon, 12 Dec 2016 16:43:10 GMT
Server: Apache/2.4.9 (Win64) PHP/5.5.12
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100

因为我用 max-age=60 服务 Cache-Control: private 我希望在一分钟后缓存将被浏览器视为过时并且它将请求一个新副本(相当于 Ctrl+F5 重新加载) 但缓存在 max-age.

后几天仍然有效

我是不是误解了这些HTTP机制?我发送的东西有误还是遗漏了什么?

如果缓存的响应在最大期限内,则认为它是 新鲜的

如果它超过了 max-age,那么它被认为是 陈旧的

如果浏览器需要一个资源并且它在缓存中有一个新的副本,那么它会使用它而无需与服务器核对。

如果浏览器有一个过时的副本,那么它会针对服务器(在这种情况下,使用 Etags)验证它是否需要它的新副本,缓存的副本仍然可以。