强缓存和协商缓存是HTTP缓存机制中常用的两种策略。
强缓存是指浏览器在发送请求之前,先检查本地缓存中是否有匹配的缓存项,如果有并且缓存未过期,则直接使用该缓存,不再向服务器发送请求。常用的强缓存策略有两种:Expires 和 Cache-Control。
- Expires 是一个时间戳,表示缓存的过期时间。服务器在响应头中返回该字段,浏览器在接收到该响应后,在过期时间之前的任何请求都会直接使用缓存。缺点是,由于是服务器返回的时间,所以可能和客户端时间不同步,不够灵活。
- Cache-Control 是HTTP/1.1规范中引入的字段,可以设置多个指令,来控制缓存策略。常用的指令有:
- max-age:表示缓存的最大有效时间,以秒为单位。
- no-cache:表示不使用强缓存,需要经过服务器验证缓存的有效性。
- no-store:表示禁止缓存,每次都要向服务器发送请求。
协商缓存是指浏览器在发送请求之前,先向服务器发送一个条件请求,询问是否可以使用缓存。如果服务器返回304状态码,表示缓存有效,浏览器则可以直接使用缓存,不再下载资源。常用的协商缓存字段有两个:Last-Modified 和 ETag。
- Last-Modified 是一个时间戳,表示资源的最后修改时间。服务器在响应头中返回该字段,浏览器在下次请求时,会将该字段放到If-Modified-Since头中发送给服务器,如果资源的最后修改时间与服务器上的一致,则返回304状态码,表示资源未修改。
- ETag 是一个唯一的标识符,可以是任意字符串。服务器在响应头中返回该字段,浏览器在下次请求时,会将该字段放到If-None-Match头中发送给服务器,如果服务器上的ETag与浏览器发送的一致,则返回304状态码,表示资源未修改。ETag相对于Last-Modified更加精确。
强缓存和协商缓存可以结合使用,当强缓存失效时,浏览器会发送一个条件请求,验证缓存的有效性,如果缓存有效,则返回304状态码,浏览器直接使用缓存。否则,返回200状态码,浏览器下载新的资源。