Cache-Control 是最重要的规则。这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。这些指令指定用于阻止缓存对请求或响应造成不利干扰的行为。这些指令通常覆盖默认缓存算法。缓存指令是单向的即请求中存在一个指令并不意味着响应中将存在同一个指令。
HTTP1.1引入了Cathe-Control它使用max-age指定组件被缓存多久为什么它使用max-age指定组件被缓存多久从请求开始在max-age时间内浏览器使用缓存之外的使用请求这样就可以消除Expires的限制
这里对http 304 状态结合max-age做一个总结:
浏览器初次访问服务器---------------服务器返回200状态
浏览器再次请求服务器时浏览器会先判断max-age如果到期则直接请求服务器否则直接从缓存中取
服务器收到请求后判断文件是否被修改过若是则直接返回200否则返回304浏览器将从缓存中获取文件。
若同步刷新页面则浏览器并不会先判断max-age而是直接发送请求服务器接收到请求后判断文件是否有变化若有则返回200若没有则返回304
我们用http访问时会先发送一个请求之后服务器返回一个应答在Chrome的开发者工具(按F12或右击选择检查)中展现了整个过程:
第一部分General是概要包含请求地址请求方式状态码服务器地址以及Referrer 策略。
第二部分是应答头部是服务器返回的。
第三部分是请求头部是客户端发送的。
这次我们从两个角度来看看http的缓存:缓存控制和缓存校验。
缓存控制:控制缓存的开关用于标识请求或访问中是否开启了缓存使用了哪种缓存方式。
缓存校验:如何校验缓存比如怎么定义缓存的有效期怎么确保缓存是最新的。
缓存控制
在http中控制缓存开关的字段有两个:Pragma 和 Cache-Control。
PragmaPragma有两个字段Pragma和Expires。Pragma的值为no-cache时表示禁用缓存Expires的值是一个GMT时间表示该缓存的有效时间。
Pragma是旧产物已经逐步抛弃有些网站为了向下兼容还保留了这两个字段。如果一个报文中同时出现Pragma和Cache-Control时以Pragma为准。同时出现Cache-Control和Expires时以Cache-Control为准。即优先级从高到低是 Pragma -> Cache-Control -> Expires
Cache-Control符合缓存策略时服务器不会发送新的资源但不是说客户端和服务器就没有会话了客户端还是会发请求到服务器的。
Cache-Control除了在响应中使用在请求中也可以使用。我们用开发者工具来模拟下请求时带上Cache-Control:勾选Disable cache刷新页面可以看到Request Headers中有个字段Cache-Control: no-cache。
同时在Response Headers中也能到Cache-Control字段它的值是must-revalidate这是服务端设置的。
Cache-Control字段在请求中使用Cache-Control 时它可选的值有:
在响应中使用Cache-Control 时它可选的值有:
server { listen 88; root /opt/ms; index index.php index.html index.htm index.nginx-debian.html; location ~* ^.+\.(css|js|txt|xml|swf|wav)$ { add_header Cache-Control no-store; add_header Cache-Control max-age=3600; add_header Cache-Control public; add_header Cache-Control only-if-cached; add_header Cache-Control no-cache; add_header Cache-Control must-revalidate; } }