强缓存和协商缓存是浏览器缓存机制中的两种方式,用于提升网页加载性能和减少服务器压力。它们通过在客户端缓存资源,避免重复请求,提高资源加载效率。
强缓存(强制缓存)
强缓存指的是浏览器可以直接使用缓存的资源,而无需向服务器发送请求验证资源的有效性。当资源的缓存未过期时,浏览器会直接从本地缓存读取资源。
实现方式:
- HTTP Header 中的
Expires或Cache-Control。
Expires:
- 指定资源的过期时间,是一个绝对时间点。
- 例如:
Expires: Wed, 21 Oct 2023 07:28:00 GMT。
Cache-Control:
- 常用的属性有
max-age,以秒为单位指定资源的有效期。 - 例如:
Cache-Control: max-age=31536000表示资源在 31536000 秒内(1 年)有效。
特点:
- 在有效期内,浏览器不会发送请求给服务器,直接使用缓存资源。
- 可以减少请求次数,提升加载速度。
协商缓存
协商缓存是在缓存过期后,浏览器发送请求到服务器,由服务器根据请求头中的特定字段判断资源是否更新。如果资源未更新,服务器返回 304 Not Modified,浏览器继续使用本地缓存。
实现方式:
- HTTP Header 中的
Last-Modified/If-Modified-Since和ETag/If-None-Match。
Last-Modified / If-Modified-Since:
Last-Modified:服务器在响应中返回资源的最后修改时间。If-Modified-Since:浏览器在请求中携带上次的Last-Modified值,服务器根据此值判断资源是否更新。
ETag / If-None-Match:
ETag:服务器为资源生成的唯一标识(一般是哈希值)。If-None-Match:浏览器在请求中携带上次的ETag值,服务器根据此值判断资源是否更新。
特点:
- 如果资源未修改,服务器返回
304,浏览器使用缓存。 - 如果资源已修改,服务器返回
200和新的资源内容。
强缓存与协商缓存的区别
-
触发条件:
- 强缓存:在缓存未过期时直接使用。
- 协商缓存:在强缓存失效后,浏览器向服务器验证资源是否更新。
-
是否与服务器交互:
- 强缓存:不与服务器交互。
- 协商缓存:需要与服务器交互,由服务器决定是否使用缓存。
-
优先级:
- 浏览器会先检查强缓存,强缓存失效后再进行协商缓存。
使用顺序
- 浏览器首先查看资源是否命中强缓存,如果命中则直接使用缓存,不发送请求。
- 如果强缓存未命中,浏览器会发送请求到服务器,进入协商缓存流程。
- 服务器根据请求头判断资源是否更新,返回
304或新的资源。 - 浏览器根据服务器响应,决定使用缓存或更新缓存。
示例
设置强缓存和协商缓存的响应头:
HTTP/1.1 200 OK
Cache-Control: max-age=3600
Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT
ETag: "5d8c72a5edda6"
总结
- 强缓存和协商缓存都是为了利用浏览器缓存提高网页性能。
- 强缓存不与服务器交互,直接使用缓存。
- 协商缓存需要与服务器交互,确认资源是否更新。
- 合理配置缓存策略可以显著提升网站的加载速度和用户体验。