我在应用程序中管理HTTP缓存。它并没有像我认为的那样工作。让我们来看一个实际的例子:
通过我的PHP页面的第一个服务,我提供以下HTTP标头:
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
我的应用程序管理Etags的验证,如果没有任何更改,则发送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
由于我使用Cache-Control: private
提供max-age=60
,我希望在一分钟之后,浏览器会认为缓存过时,它会请求一个新副本(相当于Ctrl + F5重新加载)但是相反,缓存在max-age
之后几天仍然有效。
我是否误解了这些HTTP机制?我发错了还是错过了什么?
答案 0 :(得分:1)
如果缓存的响应在max-age范围内,则会将其视为 fresh 。
如果超过最大年龄,则认为陈旧。
如果浏览器需要一个资源并且它在缓存中有一个新的副本,那么它将使用它而无需检查服务器。
如果浏览器有一个陈旧的副本,那么它将针对服务器(在这种情况下,使用Etags)验证它是否需要它的新副本,缓存副本仍然正常。