http缓存
根据是否需要向服务器发起请求,http缓存可以分为强制缓存
与协商缓存
。
强制缓存
是指如果缓存没有过期,客户端不会向服务器发起请求询问缓存的有效性,直接读取缓存数据。与强制缓存
相关的两个http响应头分别是Expires
和Cache-Control
。协商缓存
需要客户端与服务端发生交互,客户端发送本地缓存的标识,由服务端根据标识决定缓存是否有效。 两类缓存同时存在时,强制缓存优先级较高。 强制缓存
Expires
头
Expires
头部对应的值是服务器设置的资源过期时间,浏览器根据这个时间来判断缓存是否失效,但是服务器的时间常常与客户端的时间有误差,这种判断并不可靠,所以Expires
现在很少使用(Expires
属于HTTP 1.0)。
Expires:Sat, 20 Aug 2016 01:40:57 GMT复制代码
Cache-Control
头
响应头与请求头都支持这个属性。通过设置不同的值定义缓存策略。
- 禁止进行缓存
缓存中不会存储响应内容
Cache-Control:no-store复制代码
- 公共缓存
'public'表示该响应可以被中间人缓存(中间代理、CDN等),默认是私有缓存'private'
Cache-Control:public复制代码
- 私有缓存
'private'表示该响应是专用于某用户的,中间人不能缓存此响应
Cache-Control:private复制代码
- 缓存时间
'max-age={seconds}'表示缓存将在seconds秒后失效
Cache-Control:max-age=1000000复制代码
- 协商缓存
'no-cache'表示客户端必须每次询问服务端缓存是否失效,从而决定是否使用缓存内容
Cache-Control:no-cache复制代码
协商缓存
协商缓存
策略下,即使本地有缓存数据,客户端任然会向服务端发送一个请求,并且携带本地缓存的标识,服务端通过这个标识来判断缓存是否过期,如果缓存过期,返回新的数据;如果没有过期,返回304状态码告知客户端可以继续使用缓存。缓存的标识可以通过两种方式来传递。
- 方式一:
Last-Modified
响应头和If-Modified-Since
请求头
响应头
Last-Modified
的值是服务端返回的资源最后修改时间,这个值将在下一次客户端请求时作为请求头If-Modified-Since
的值发送给服务端,服务端对比这个值与资源的最近一次修改时间,从而决定缓存是否过期。
# requestIf-Modified-Since: Thu, 28 Jun 2018 12:12:38 GMT# responseLast-Modified: Thu, 28 Jun 2018 12:12:38 GMT复制代码
- 方式二:
ETag
响应头与If-None-Match
请求头
响应头
ETag
的值是服务端返回的资源的唯一标识(资源一旦修改,该标识就会变化),这个值将在下一次客户端请求时作为请求头If-None-Match
的值发送给服务端,服务端进行对比后决定缓存是否过期。
# requestIf-None-Match: W/"2a9-164464f492d"# responseETag: W/"2a9-164464f492d"复制代码
一般来讲ETag
与Last-Modified
可能同时存在,但是ETag
的优先级会更高。