HTTP协议之缓存

89 阅读4分钟

响应 Header 的缓存

HTTP缓存是提高网站性能和减少方服务器负载的重要机制。常见的缓存头部

  • Cache-Control:是最重要的缓存控制头,它定义了缓存策略,告诉浏览器和中间缓存如何缓存响应。常见指令

pulic:响应可以被任何缓存(比如浏览器缓存,代理服务器等)缓存,即使是用户的私有数据

private:只能被客户端缓存,不能被共享缓存

no-cahce:客户端可以缓存响应。当每次使用缓存的内容时,必须向服务器验证资源是否被修改。(通过ETag or Last-Modifed)

No-store:完全禁止缓存响应。每次请求都必须从服务器获取

max-age=:缓存最大有效期。例如max-age=3600 表示资源可以缓存1小时。

s-maxage=跟max-age类似,但只使用与共享缓存,不影响浏览器缓存

must-revalidate:当缓存过期时,必须向服务器验证缓存的有效性

proxy-revalidate:与must-revalidate 类似,但只适用于代理服务器

Immutable :表示资源永远不会改变,客户端不需要重新验证缓存

Cache-Control: public, max-age=3600 //此响应可以被任何缓存缓存,且有效期为1小时。
  • Expires 与Cache-Control 冲突 现在很少单独使用,优先使用Cache-Control

是一个日期/时间字段,指定响应缓存的过期时间。它是 HTTP/1.0 引入的,但在HTTP/1.1 中,Cache-Control头取代了它的作用。Expires 仅在使用HTTP/1.0 时有作用。,并且是基于绝对时间。如果Cache-Contorl 存在,并且包含max-age,则Cache-Control优先。

Expires: Wed, 21 Oct 2015 07:28:00 GMT 
//表示响应会在这个日期和时间之前被缓存,之后必须重新向服务器请求资源。
  • Last-Modified

用于告诉缓存的资源上次修改的时间。浏览器或缓存可以根据这个时间判断资源是否发生了变化,以决定是否需要重新从服务器请求该资源。

当需要重新发起请求时,会发送 If-Modified-Since 头,包含资源上次修改的时间。如果资源自该时间以来没有被修改,服务器会返回 304 Not Modified 状态,表示可以继续使用缓存。

Last-Modified: Tue, 15 Nov 2025 12:45:00 GMT

If-Modified-Since: Tue, 15 Nov 2024 12:45:00 GMT //If-Modified-Since 请求头
  • ETag

是一种唯一标识资源的标识符,通常是资源内容的哈希值。当资源内容发生变化时,ETag值会改变。

当浏览器发起请求时,会带上If-Modified-Match 头,包含之前接收到的ETag值,服务器对此进行判断是否发生变化。没有则返回 304 Not Modified

ETag: "d41d8cd98f00b204e9800998ecf8427e"

If-None-Match: "d41d8cd98f00b204e9800998ecf8427e"
  • Age

是一种表示从缓存对象被生产或从原始服务器获取以来,已经经过的时间。它通常由缓存代理(如CDN或中间缓存服务器)插入,,并向客户端报告缓存内容的实际老化程度。

  • Vary 响应

它是告诉缓存代理在缓存响应时,应该考虑哪些请求头字段来区分不同的响应版本。举个例子,某个网站根据浏览器语言设置返回不同的语言版本的页面。如果缓存代理只缓存一个版本的响应,那么用户在不同语言环境下可能看的错误的页面。

Vary: Accept-Language //响应内容取决于请求头中的 Accept-Language 字段。
Accept-Language: en-US
Accept-Language: fr-FR
两个用户请求头分别是这个 这会缓存不同语言版本的响应

但它会使得缓存变得更加复杂,Vary 的使用需要谨慎,以免影响缓存效率,并确保缓存代理根据正确的请求头组合缓存响应内容。