说下 HTTP 强缓存 和 协商缓存 的区别,分别看哪些响应头/请求头?
核心区别一句话:
- 强缓存:浏览器自己判断“还没过期”,不发请求,直接用本地副本。
- 协商缓存:浏览器会发请求问服务器“资源变没变”,由服务器决定用旧的还是新的。
分别看哪些头:
- 强缓存
- 主要看响应头:
Cache-Control(最重要,尤其max-age)Expires(老方案,兼容用)
- 请求头:
- 命中强缓存时通常没有对应网络请求(所以也就没有验证类请求头)
- 若用户强刷/禁缓存,可能带
Cache-Control: no-cache、Pragma: no-cache
- 协商缓存
- 服务器下发的响应头:
ETagLast-Modified
- 浏览器下次请求带的请求头:
If-None-Match(对应ETag)If-Modified-Since(对应Last-Modified)
返回结果:
- 未变化:
304 Not Modified(通常无响应体,继续用本地) - 已变化:
200 OK+ 新内容(并更新ETag/Last-Modified)
补充:实际流程通常是先看强缓存,强缓存不命中再走协商缓存。