HTTP的场景实践:Chrome浏览器缓存策略分析 | 豆包MarsCode AI刷题

40 阅读2分钟

HTTP缓存策略是浏览器和服务器之间为了减少网络请求、提高响应速度而采取的一种优化措施。它主要分为两种:强制缓存(也称为强缓存或HTTP缓存)和协商缓存。下面以Chrome浏览器为例,对这两种缓存策略进行具体分析。

1. 强制缓存(HTTP缓存)

强制缓存主要通过Cache-ControlExpires响应头来控制。Cache-Control是HTTP/1.1的字段,而Expires是HTTP/1.0的字段。当这两个字段同时存在时,Cache-Control的优先级更高。

  • Cache-Control: 可以设置多个指令,如max-agepublicprivateno-cache等。

    • max-age=<seconds>: 指定资源能够被缓存的最大时间(秒)。
    • public: 表示响应可以被任何中间缓存存储,包括中间代理、CDN等。
    • private: 表示响应是为单个用户准备的,只能被浏览器缓存。
    • no-cache: 表示缓存的数据不可直接使用,需要与服务器确认数据是否更新。
  • Expires: 指定资源过期的具体日期和时间,优先级低于Cache-Control

实践分析: 假设服务器返回以下响应头:

Cache-Control: public, max-age=31536000

这意味着资源将被缓存1年(31536000秒),在这一年内,浏览器将直接从本地缓存读取资源,而不会向服务器发送请求。

2. 协商缓存

当强制缓存未命中时,浏览器会使用协商缓存。协商缓存通过Last-Modified/If-Modified-SinceETag/If-None-Match这两对HTTP头来控制。

  • Last-Modified: 服务器返回资源的最后修改时间。
  • If-Modified-Since: 浏览器在再次请求时,将带上这个时间戳,询问服务器在该时间后资源是否有更新。
  • ETag: 服务器返回资源的一个唯一标识符。
  • If-None-Match: 浏览器在再次请求时,将带上这个ETag值,询问服务器资源是否有变化。

实践分析: 假设服务器返回以下响应头:

ETag: "uniqueETagValue"

当浏览器再次请求该资源时,它会发送请求头:

If-None-Match: "uniqueETagValue"

服务器检查ETag值,如果没有变化,返回304状态码,告诉浏览器可以使用本地缓存的资源;如果ETag值变化了,说明资源已更新,服务器将返回新的资源和新的ETag值。

总结

通过合理配置HTTP缓存策略,可以显著提高网站的访问速度和用户体验。对于不经常变化的资源,可以设置较长的max-age值;对于经常变化的资源,可以使用no-cache或结合ETagLast-Modified进行协商缓存。这样,浏览器能够智能地决定是否从本地缓存读取资源,或者向服务器请求最新的资源。