http缓存有两种,分别是强制缓存和协商缓存。
强制缓存
强制缓存是比较服务器响应头中的过期时间来进行判断是否取本地缓存的。基于响应头中的expires和Cache-Control字段。
expires字段
是绝对时间,如果客户端和服务端时间不一样,会导致判断缓存是否过期不准确。
Cache-Control字段
是相对时间,返回max-age,然后计算得到过期时间,浏览器再次请求时会判断是否过期。然后还有更多选项完成更精细的配置。
建议使用Cache-Control字段
使用流程
- 浏览器第一次请求资源,服务器返回该资源对应的生成时间。
- 客户端根据Cache-Control的max-age计算出资源过期时间。
- 客户端再次请求该资源时会判断资源是否已过期。没有过期使用缓存,过期了请求服务端。
协商缓存
协商缓存是服务器响应304状态码告诉客户端是否使用缓存;
有两种方法
方法一:
使用请求头中If-Modifed-Since和响应头中的Last-Modifed决定是否使用缓存;
使用流程:
- 当cache-control判断资源过期后,客户端会将Last-Modifed值赋值给If-Modifed-Since;
- 服务端收到请求后对比资源更新时间和If-Modifed-Since的值,如果大于If-Modifed-Since说明资源更新了,响应200.如果小于If-Modifed-Since资源没有更新,响应304;
方法二:
使用请求头中的If-None-Match和响应头中的Etag决定是否使用缓存;
使用流程:
- 当Cache-Control判断资源过期时,客户端会将资源的唯一标识Etag复制给If-None-Match;
- 服务端收到请求后判断If-None-Match值是否和对应资源唯一标识一样,如果不一样返回200.如果一样返回403;