HTTP 缓存是一种用于减少网络流量和提高网站性能的重要技术。HTTP 缓存可以分为两种主要类型:强制缓存和协商缓存。它们的区别在于缓存策略和服务器与客户端之间的交互方式。
- 强制缓存:
- 强制缓存是用过设置响应头来控制的,通常使用 Cache-Control 和 Expires 头。
- Cache-Control 头中的 max-age 指定了资源在客户端缓存中的有效时间(秒),例如:Cache-Control: max-age=3600 表示资源在客户端缓存中有效期为1小时。
- Expires 头是一个过时的方法,它指定了资源的过期日期,客户端将根据这个日期来判断资源是否过期。
- 当资源被强制缓存,客户端在下次请求该资源时,会首先检查缓存中的有效期,如果资源尚未过期,客户端将直接从缓存中加载资源,而不向服务器发送请求。
- 强制缓存通常用于不经常更改的静态资源,它可以减少服务器的负载并加快页面加载速度。
- 协商缓存(304):
- 协商缓存是使用请求头来控制的,通常使用 If-Modified-Since 和 If-None-Match 等请求头。
- 当客户端向服务器请求资源时,它会发送先前缓存的资源的元信息,如最后修改时间(If-Modified-Since)或资源的标识符(If-None-Match)。
- 服务器会根据这些信息判断资源是否发生了变化,如果资源未发生变化,服务器会返回一个 304 Not Modified 响应,告诉客户端可以继续使用缓存中的资源。
- 如果资源已经发生了变化,服务器会返回新的资源,并将其缓存,客户端会更新缓存并使用新的资源。
- 协商缓存通常用于动态或频繁更改的内容,它减少了不必要的网络传输,但需要服务器进行额外的计算以判断资源是否已更改。
综上所述,强制缓存是通过设置响应头来告诉客户端在一定时间内直接使用缓存,而协商缓存是通过比较请求头中的信息来判断资源是否需要重新加载。通常,强制缓存优先级较高,如果资源被强制缓存,将不会进行协商缓存的检查。如果强制缓存失效,才会进行协商缓存的判断。这两种缓存策略可以结合使用,以提高性能并减少服务器负载。