Cache-Control 是一个 HTTP 协议中关于缓存的响应头,它用于指定所有缓存机制在整个请求/响应链中必须服从的指令。这些指令主要用于控制浏览器和其他中间缓存如何缓存和重新使用已缓存的响应。Cache-Control 提供了比 Expires 头部更精确和灵活的缓存控制方式。
基本概念
定义:Cache-Control 是一个 HTTP 头,用于控制浏览器和其他中间缓存如何缓存和重新使用已缓存的响应。
位置:Cache-Control 可以在请求头或响应头中设置。
作用:指定请求和响应遵循的缓存机制,包括何时、如何缓存响应以及如何验证缓存的有效性。
常用指令
Cache-Control 的值是一组由逗号分隔的指令,以下是一些常见的指令及其说明:
指令 说明
public 所有内容都将被缓存(客户端和代理服务器都可缓存)。
private 内容只缓存到私有缓存中(仅客户端可以缓存,代理服务器不可缓存)。
no-cache 指示浏览器忽略资源缓存副本,强制到服务器获取资源(但允许缓存协商)。
no-store 禁止使用任何缓存策略,客户端每次请求都需要服务端给予最新的响应。
max-age=xxx 缓存的内容将在 xxx 秒后失效,这个选项只在 HTTP 1.1 中可用。
must-revalidate 如果缓存的内容失效,请求必须发送到服务器进行重新验证。
proxy-revalidate 类似于 must-revalidate,但仅适用于共享缓存(如代理服务器)。
s-maxage=xxx 类似于 max-age,但专门为共享缓存(如 CDN)设置,优先级高于 max-age。
no-transform 告诉中间代理不要改变资源的格式。
工作原理
当浏览器或其他客户端请求资源时,它会检查 Cache-Control 头部以确定是否可以从缓存中获取资源。如果 Cache-Control 指示资源是缓存的,并且缓存仍然有效(例如,max-age 指令指定的时间尚未过期),则客户端将使用缓存的响应而不是向服务器发送新的请求。如果缓存已过期或 Cache-Control 指示不进行缓存(如 no-store 或每次请求都需验证的 no-cache),则客户端将向服务器发送请求以获取新的响应。
部署与配置
Cache-Control 响应头可以部署在服务端(如 Apache、Nginx 等服务器程序)或直接在代码中添加。通过合理配置 Cache-Control,可以显著提高网站的访问速度和性能,同时保护敏感信息不被缓存。
示例
一个响应头可能包含如下的 Cache-Control 指令:
http
Cache-Control: public, max-age=3600
这意味着此响应可以被任何缓存缓存,并且是新鲜的,在接下来的 3600 秒(1 小时)内,客户端可以直接从缓存中获取响应而无需向服务器发送请求。
结论
Cache-Control 是 HTTP 缓存控制中最重要和灵活的机制之一。通过合理配置 Cache-Control 指令,可以有效地管理缓存行为,提高网站性能并保护用户隐私。