此篇简单介绍web浏览器缓存的过程(304)
-
浏览器第一次访问Url,向服务器发送请求报头(HTTP Request Header),服务器响应同时记录相关属性标记(HTTP Response Header),其中状态码为200。
HTTP/1.1 200 OK Date: Mon, 14 Jan 2019 06:04:10 GMT Content-Type: image/jpeg # 响应类型为image/jpeg Content-Length: 83185 # 响应大小为83185 Cache-Control: max-age=3600 # 从请求时间开始到过期时间之间的秒数 Expires: Mon, 14 Jan 2019 07:04:10 GMT # 缓存过期时间 Etag: "5d8c72a5edda8d6a:3239" # 服务器生成的唯一标志符
-
浏览器第二次请求此url时,向服务器发送请求报头,服务器响应请求,但是发现标记文件没有发生改动,于是服务器返回304。
浏览器收到此状态码之后,直接从浏览器缓存中读取。HTTP/1.x 304 Not Modified Date: Mon, 14 Jan 2019 05:03:56 GMT Content-Type: image/jpeg Content-Length: 83185 Last-Modified: Sun, 13 Jan 2019 08:01:04 GMT Cache-Control:max-age=3600 Expires: Thu, 02 Apr 2019 05:14:08 GMT Etag:"5d8c72a5edda8d6a:3239"
字段解读:
-
Expires
Expires(过期时间)是控制缓存的基本手段,告诉缓存器,副本在什么时间范围是新鲜的,过了这个时间,缓存器应该向服务器发送请求,检查文档是否发生修改。Expires对静态资源特别有效,可以在Nginx等web服务器设置很长的过期时间(这个时间必须是格林威治时间GMT,中国处于东八区,时间为GMT+8)
-
Cache Control
通过这个属性可以让内容发布者全面控制内容,定位过期时间的限制。
Cache Control的值可以为:- max-age=[秒]: 缓存过期时间,是基于请求时间的相对间隔,单位为秒
- public:标记认证的内容也可以被缓存。一般上需要认证才能访问的内容,默认是不缓存的。
- no-cache:强制每次请求都直接发送到源服务器,不经过本地缓存。
- no-store:强制任何情况下都不留下缓存副本。
- must-revalidate:声明请求的资源,如果在过期时间之内,且声明了资源的修改时间或者ETag之类的标志,是否应当向服务器确认资源是否是最新的。如果使用了这个属性,则每次都必须向服务器确认。
- last-modified:文档最后修改时间
浏览器第一次请求时,服务器在响应头返回这个字段last-modified: Sun, 13 Jan 2019 08:01:04 GMT
,标明文档上次修改时间。
第二次请求时,请求头加上if-modified-since: Sun, 13 Jan 2019 08:01:04 GMT
,服务器可以根据这个时间判断文档是否在这个时间之后发生变更。
ETag
简单说就是,服务器响应时给请求的url标记,并在HTTP响应头中将其发送给客户端,例如etag: W/"3189a0471d72d02f2c1d8edc023afed0"
。
服务端再次请求时,在请求头加上if-none-match: W/"3189a0471d72d02f2c1d8edc023afed0"
。
如果etag没有发生变化,服务器直接返回304
-