源服务器的缓存控制及相关实践

源服务器的缓存控制是通过HTTP响应头中的缓存相关字段来实现的,这些字段指示客户端(如浏览器)和中间代理服务器如何缓存资源。以下是一些关键的缓存控制响应头:
-
Cache-Control:
max-age=<seconds>
: 指定资源的最大缓存时间,单位是秒。例如,max-age=3600
表示资源可以被缓存1小时。no-cache
: 强制客户端在使用缓存前向服务器验证资源是否过期。no-store
: 禁止缓存资源,通常用于敏感数据。public
: 允许任何缓存(包括客户端和代理服务器)缓存资源。private
: 只允许客户端缓存资源,不允许代理服务器缓存。
-
Expires:
- 指定资源的过期时间,是一个具体的日期和时间。例如,
Expires: Wed, 21 Oct 2025 07:28:00 GMT
。如果同时设置了Cache-Control
的max-age
,max-age
优先级更高。
- 指定资源的过期时间,是一个具体的日期和时间。例如,
-
ETag:
- 资源的唯一标识符,通常是一个哈希值。客户端在后续请求中可以通过
If-None-Match
头将ETag发送给服务器,服务器根据ETag判断资源是否已更改,从而决定返回304(Not Modified)还是新的资源。
- 资源的唯一标识符,通常是一个哈希值。客户端在后续请求中可以通过
-
Last-Modified:
- 资源的最后修改时间。客户端在后续请求中可以通过
If-Modified-Since
头将最后修改时间发送给服务器,服务器根据这个时间判断资源是否已更改,从而决定返回304还是新的资源。
- 资源的最后修改时间。客户端在后续请求中可以通过
-
Vary:
- 指定哪些请求头字段会影响缓存。例如,
Vary: User-Agent
表示不同的User-Agent请求可能会得到不同的资源版本。
- 指定哪些请求头字段会影响缓存。例如,
示例
HTTP/1.1 200 OK
Content-Type: text/html
Cache-Control: public, max-age=3600
ETag: "686897696a7c876b7e"
Last-Modified: Wed, 21 Oct 2020 07:28:00 GMT
最佳实践
- 静态资源:对于不经常变化的静态资源(如图片、CSS、JS文件),可以设置较长的
max-age
,并配合ETag
或Last-Modified
进行缓存验证。 - 动态内容:对于频繁变化的动态内容,可以使用
no-cache
或较短的max-age
,确保客户端及时获取最新内容。 - 敏感数据:对于敏感数据,使用
no-store
确保数据不会被缓存。
通过合理配置这些缓存控制头,可以有效减少服务器负载,提升用户体验。