缓存Cache-Control

可缓存性

指定哪些地方可以缓存

public

http请求返回的过程中,http请求返回的内容所经过的任何路径包括:中间的代理服务器发出请求的客户端浏览器,都可以对返回的内容进行缓存。

private

发起请求的浏览器可以缓存。

no-cache

任何节点都不能缓存。

到期

max-age

max-age=缓存到 max-age 之后才会过期。过期了之后,浏览器再次发送请求到服务器端,请求新的内容。

第一次请求:

缓存Cache-Control_第1张图片

第二次请求:

缓存Cache-Control_第2张图片

注意:cache-control: max-age=600 这个是在后端的响应头中设置的。

问题:如果在max-age时间内,服务器文件有修改,这样用户就不能第一时间获取最新的信息。所以在前端每次打包静态文件的名称都是 hash 值的,这样每次请求都是新路径,就不会再去缓存中找了。

s-maxage

s-maxage=和 max-age 功能相似,但是只有在 代理服务器 中生效,浏览器端还是会读取 max-age 到期时间。

max-stale

max-stale=max-age过期之后,只要在 max-stale 的时间内,还可以使用过期的缓存。

重新验证

must-revalidate

设置了 max-age 缓存,如果缓存过期了,必须去服务端重新请求,重新获取数据。

proxy-revalidate

和 must-revalidate 类似,用在缓存服务器中。

no-store & no-cache

no-cache:可以在本地进行缓存,每次发起请求都要去服务器验证,如果服务器返回的请求告诉我可以使用本地的缓存,才能使用本地的缓存。(需要经过服务器端的验证)no-store是彻底不能在本地或者代理服务器存储缓存,也不会有验证环节,永远请求服务器的数据。

缓存Cache-Control_第3张图片

验证资源能否使用缓存的过程

Last-Modified

Last-Modified:表示服务端资源最后修改的时间,由服务端传递到客户端。

If-Modified-Since:表示询问服务端,从某个时间点起资源是否修改了。这个时间点一般是服务端Last-Modified返回的时间点。

Etag

Etag:表示字符串唯一标识符,也是传给客户端,用于告诉客户端,表示服务端资源发生修改了的最新标识,Etag的值一般是由文件内容生成的。

If-None-Match:表示询问服务端,某个tag字符串值是否不匹配,这个tag值一般是服务端Etag返回的最新的字符串标识符。、

缓存Cache-Control_第4张图片

总结:客户端请求服务端时,服务端在响应头添加 Last-Modified:最新的时间,Etag:最新的字符串标识符},客户端保存服务端的Last-Modified的值和Etag的值,下次请求服务器时,在请求头添加If-Modified-Since:最新的时间,Etag:最新的字符串标识符。然后服务器去检查请求头的信息,判断客户端是从缓存中读数据还是重新把服务器的数据给客户端。

no-transform

用在 proxy 服务器上,有的 proxy 会把服务器返回的内容进行压缩或者格式的转换,这个是不允许的。no-transform 告诉代理服务器不要随便的改动返回的内容。

你可能感兴趣的:(http,缓存)