强缓存
不会向服务器发送请求,直接从缓存中读取资源,在游览器控制台的Network选项中可以看到该请求返回200的状态码
强缓存又分为Expires 和 Cache-Control
- HTTP 1.0
-
ExpiresExpires: Wed, 22 Nov 2019 08:41:00 GMT,
该值是一个GMT时间格式个字符串,浏览器进行第一次请求时,服务器会在返回头部加上Expires,下次请求,如果在这个时间之前则命中缓存
缺点:服务器的时间和浏览器的时间可能并不一致导致失效
- HTTP 1.1
-
Cache-Control:max-age:3600该值是利用max-age判断缓存的生命周期,是以秒为单位,如在生命周期时间内,则命中缓存
协商缓存
向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源
协商缓存利用Last-Modified , If-Modified-Since 和 ETag , If-None-Match来实现
- HTTP 1.0 :
Last-Modified(响应头) ,If-Modified-Since
-
Last-Modified:response返回,表示为资源的最后更新时间Last-Modified:Wed, 22 Nov 2019 09:41:00 GMT
缺点:精度不够细,当用户1秒钟更改多次,就无法区分哪次提交是最新
-
If-Modified-Since:通过比较两次的时间判断,资源在请求期间是否有修改,假如没有修改,则命中协商缓存,浏览器从缓存中读取资源,如果没有命中,资源有过修改,返回新的Last-Modified时间和服务器资源If-Modified-Sinc, 22 Nov 2019 09:41:00 GMT
- HTTP 1.1 :
ETag,If-None-Match(请求头)
ETag:为相应头部字段,表示资源内容的唯一标识,随服务器response返回;If-None-Match: 请求头中的If-None-Match传入 缓存文件 ETag 和 当前服务器里资源中的etag是否一致,来判断资源是否修改过,如果没有修改,则命中缓存,浏览器从缓存中读取资源,如果修改过,服务器会返回新的etag,并返回资源;
ETag解决了Last-Modified使用时可能出现的资源的时间戳变了但内容没变及如果再一秒钟以内资源变化但Last-Modified没变的问题,感觉ETag更加稳妥。
- Pragma mdn已经弃用,太古老了
共同点:都是从客户端缓存中读取资源; 区别是强缓存不会发请求,协商缓存会发请求。