推荐答案
什么是 HTTP 缓存?
HTTP 缓存是一种通过存储资源的副本,以便在后续请求中快速响应的机制。它可以减少服务器负载、降低网络延迟,并提升用户体验。HTTP 缓存通常分为两种类型:强缓存和协商缓存。
- 强缓存:浏览器直接从本地缓存中获取资源,而不需要与服务器进行通信。强缓存通过
Cache-Control
和Expires
响应头来控制。 - 协商缓存:浏览器在请求资源时,会向服务器发送请求,服务器通过
ETag
或Last-Modified
响应头来判断资源是否已更新。如果资源未更新,服务器返回 304 状态码,浏览器使用本地缓存。
如何配置 HTTP 缓存策略?
HTTP 缓存策略主要通过设置 HTTP 响应头来配置:
Cache-Control
:这是最常用的缓存控制头,可以设置缓存的最大有效期、是否允许缓存等。常见指令包括:max-age=<seconds>
:资源在缓存中的最大存储时间(秒)。no-cache
:每次请求都需要向服务器验证资源是否更新。no-store
:禁止缓存资源。public
:允许所有用户(包括代理服务器)缓存资源。private
:仅允许客户端缓存资源。
Expires
:指定资源的过期时间(绝对时间),优先级低于Cache-Control
。ETag
:资源的唯一标识符,用于协商缓存。服务器通过比较ETag
来判断资源是否更新。Last-Modified
:资源的最后修改时间,用于协商缓存。
示例配置:
Cache-Control: public, max-age=31536000 ETag: "123456789" Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT
本题详细解读
HTTP 缓存的工作原理
强缓存:
- 浏览器首次请求资源时,服务器返回资源并附带
Cache-Control
或Expires
头。 - 浏览器根据这些头信息将资源缓存到本地。
- 后续请求时,浏览器会先检查缓存是否有效。如果有效,则直接使用缓存资源,无需与服务器通信。
- 浏览器首次请求资源时,服务器返回资源并附带
协商缓存:
- 如果强缓存失效,浏览器会向服务器发送请求,并附带
If-None-Match
(基于ETag
)或If-Modified-Since
(基于Last-Modified
)头。 - 服务器根据这些头信息判断资源是否更新。如果未更新,返回 304 状态码,浏览器使用本地缓存;如果已更新,返回新资源。
- 如果强缓存失效,浏览器会向服务器发送请求,并附带
缓存策略的选择
- 对于静态资源(如图片、CSS、JS 文件),通常使用强缓存并设置较长的
max-age
。 - 对于动态资源(如 API 响应),通常使用协商缓存或
no-cache
,以确保获取最新数据。
注意事项
- 缓存策略需要根据业务需求灵活调整,避免缓存过期或缓存污染问题。
- 使用
ETag
时,确保服务器生成的标识符是唯一的且能准确反映资源的变化。 - 在开发环境中,建议禁用缓存或使用
no-cache
,以便及时获取最新资源。