Skip to content

http 缓存协议

HTTP 缓存协议是用于减少网络流量、加快网页加载速度以及减轻服务器负载的重要机制。它允许客户端(通常是浏览器)存储资源副本,并在后续请求中使用这些副本,而不是每次都从原始服务器重新下载。以下是关于 HTTP 缓存协议的关键概念和工作原理的详细介绍。

缓存控制头

HTTP 缓存主要依赖于响应头中的特定字段来指示缓存的行为。以下是一些重要的缓存控制头部字段:

  • Cache-Control:这是最重要的缓存控制指令,可以出现在请求或响应中,用来指定缓存行为。

    • public:表明响应可以被任何缓存存储。
    • private:表明响应仅供单个用户使用,不应被共享缓存存储。
    • no-store:禁止缓存保存任何版本的响应。
    • no-cache:要求在使用缓存前必须先向源服务器验证该资源是否已更改。
    • max-age=<seconds>:指定了资源被视为新鲜的最大时间长度(秒数)。
    • s-maxage=<seconds>:类似于max-age,但专门针对共享缓存(如代理服务器)。
  • Expires:指定资源被认为过期的具体日期/时间。如果同时存在Cache-Control: max-ageCache-Control: s-maxage,则Expires会被忽略。

  • ETag:提供了一种验证缓存的有效性的方法。它是根据文件内容生成的一个唯一标识符。当资源发生变化时,ETag 也会改变。

  • Last-Modified:表示资源最后修改的时间。与If-Modified-Since请求头配合使用,可以在条件 GET 请求中检查资源是否已被修改。

条件请求

为了优化性能并确保数据的一致性,HTTP 支持条件请求。这允许客户端仅在满足某些条件的情况下才获取资源的新副本。

  • If-None-Match:如果当前的 ETag 值与请求头中的 ETag 值相同,则返回 304 Not Modified 状态码而不发送实体主体,否则返回更新后的资源。
  • If-Modified-Since:只有当资源自指定日期以来已经修改过时,才会返回新的资源;否则返回 304 Not Modified。

缓存验证流程

  1. 首次请求:客户端第一次请求资源时,服务器返回完整的响应包括上述提到的缓存相关头部信息。
  2. 后续请求
    • 如果资源未过期(基于Cache-ControlExpires),则直接使用本地缓存。
    • 若资源可能过期,则发送一个条件 GET 请求(包含If-None-MatchIf-Modified-Since),询问服务器资源是否有更新。
    • 如果资源没有变化,服务器返回 304 Not Modified;如果有变化,则返回 200 OK 及新资源。

通过合理配置这些头部字段,开发者能够有效地控制资源的缓存策略,从而提升用户体验并降低服务器负担。正确理解和应用 HTTP 缓存协议对于构建高效、响应迅速的 Web 应用程序至关重要。

Released under the MIT License.