可缓存性
指定哪些地方可以缓存
public
http请求返回的过程中,http请求返回的内容所经过的任何路径包括:中间的代理服务器,发出请求的客户端浏览器,都可以对返回的内容进行缓存。
private
发起请求的浏览器可以缓存。
no-cache
任何节点都不能缓存。
到期
max-age
max-age=<seconds>缓存到 max-age 之后才会过期。过期了之后,浏览器再次发送请求到服务器端,请求新的内容。
第一次请求:
第二次请求:
注意:cache-control: max-age=600 这个是在后端的响应头中设置的。
问题:如果在max-age时间内,服务器文件有修改,这样用户就不能第一时间获取最新的信息。所以在前端每次打包静态文件的名称都是 hash 值的,这样每次请求都是新路径,就不会再去缓存中找了。
s-maxage
s-maxage=<seconds>和 max-age 功能相似,但是只有在 代理服务器 中生效,浏览器端还是会读取 max-age 到期时间。
max-stale
max-stale=<seconds>max-age过期之后,只要在 max-stale 的时间内,还可以使用过期的缓存。
重新验证
must-revalidate
设置了 max-age 缓存,如果缓存过期了,必须去服务端重新请求,重新获取数据。
proxy-revalidate
和 must-revalidate 类似,用在缓存服务器中。
no-store & no-cache
no-cache:可以在本地进行缓存,每次发起请求都要去服务器验证,如果服务器返回的请求告诉我可以使用本地的缓存,才能使用本地的缓存。(需要经过服务器端的验证)no-store是彻底不能在本地或者代理服务器存储缓存,也不会有验证环节,永远请求服务器的数据。
验证资源能否使用缓存的过程
Last-Modified
Last-Modified:表示服务端资源最后修改的时间,由服务端传递到客户端。
If-Modified-Since:表示询问服务端,从某个时间点起资源是否修改了。这个时间点一般是服务端Last-Modified返回的时间点。
Etag
Etag:表示字符串唯一标识符,也是传给客户端,用于告诉客户端,表示服务端资源发生修改了的最新标识,Etag的值一般是由文件内容生成的。
If-None-Match:表示询问服务端,某个tag字符串值是否不匹配,这个tag值一般是服务端Etag返回的最新的字符串标识符。、
总结:客户端请求服务端时,服务端在响应头添加 Last-Modified:最新的时间,Etag:最新的字符串标识符},客户端保存服务端的Last-Modified的值和Etag的值,下次请求服务器时,在请求头添加If-Modified-Since:最新的时间,Etag:最新的字符串标识符。然后服务器去检查请求头的信息,判断客户端是从缓存中读数据还是重新把服务器的数据给客户端。
no-transform
用在 proxy 服务器上,有的 proxy 会把服务器返回的内容进行压缩或者格式的转换,这个是不允许的。no-transform 告诉代理服务器不要随便的改动返回的内容。