Fork me on GitHub

HTTP缓存

浏览器缓存

缓存主要分为强缓存和协商缓存,使用方法为在HTTP请求/响应中加入头部信息。

使用场景为:
1、浏览器需要资源A,当浏览器需要这个资源时会先检测本地是否有该资源的缓存
2、如果没有缓存则向服务器发出请求,服务器下发一个强缓存
3、如果有缓存,则检测缓存是否过期,如果没过期则直接使用,如果过期了则进行协商缓存

强缓存

Expires: Expires:Thu,21 Jan 2017 23:23:23 GMT
服务器下发的资源绝对过期时间

Cache-Control: Cache-Control:max-age=3600
由于客户端和服务器时间可能存在偏差,于是出现了这种方法。原理为规定相对于系统时间的一段时间,单位为秒,表示在客户端在收到资源3600秒后资源失效

ExpiresCache-Control同时存在时,以Cache-Control为准

协商缓存


Last-Modified If-Modidied-Since : Last-Modified:Wed,26 Jan 2017 17:17:17 GMT
客户端发送本地文件上次更新的时间,与服务器文件上次更新的时间作比较,如果不同则更新资源。

Etag If-None-Match:
上述方法有一个缺点: 有可能资源内容没更新,但是文件被修改了,这就导致了没必要的浪费,于是出现了Etag字段
也是使用客户端和服务端的文件信息比较,只不过这是比较类似于Hash的值,通过这种方法可以判断文件资源是否发生改变。

不缓存

Cache-Control:no-cache

使用no-cache可以防止客户端从缓存中获取过期的资源。它告诉浏览器、缓存服务器,不管本地副本是否过期,使用资源副本前,一定要到源服务器进行副本有效性校验。
(1)当客户端发送的请求包含no-cache时,表示客户端将不会接受缓存资源,缓存服务器必须将请求转发给源服务器。
(2)当服务端返回的响应包含no-cache时,源服务器将不会对缓存服务器提出的请求进行有效性确认,缓存服务器也不能对资源进行缓存。

与之比较像的字段有must-revalidate:它告诉浏览器、缓存服务器,本地副本过期前,可以使用本地副本;本地副本一旦过期,必须去源服务器进行有效性校验。

Cache-Control:no-store

当使用no-store时,缓存不能在本地存储请求或响应的任何部分,即完全不缓存

返回顶部