返回介绍

最佳实践 9:理解 HTTP 协议中的缓存控制:服务器端缓存控制头部信息

发布于 2025-04-20 17:44:39 字数 3128 浏览 0 评论 0 收藏

HTTP 协议采用客户端请求(Request)、服务器端响应(Response)的模型。在请求和响应中,都能通过相关控制指令对对端的缓存行为进行管理。首先需要关心的是,服务器端响应中的缓存控制头部,利用这些头部控制信息可以精细化地管理客户端的缓存行为。

下面使用 wget 命令来看一个简单的例子。

#  wget -S http://10.1.6.28/test.jpg #使用-S 参数,指定显示响应头部信息
--2016-01-08 15:47:29--  http://10.1.6.28/test.jpg
Connecting to 10.1.6.28:80... connected.
HTTP request sent, awaiting response... 
  HTTP/1.1 200 OK
  Server: nginx/1.9.7
  Date: Fri, 08 Jan 2016 07:47:28 GMT
  Content-Type: image/jpeg
  Content-Length: 20305
  Last-Modified: Fri, 08 Jan 2016 07:25:26 GMT ①
  Connection: keep-alive
  ETag: "568f6466-4f51" ②
  Expires: Sat, 09 Jan 2016 07:47:28 GMT ③
  Cache-Control: max-age=86400 ④
  Accept-Ranges: bytes
Length: 20305 (20K) [image/jpeg]
Saving to: `test.jpg'

100%[===================================================================================================>] 20,305      --.-K/s   in 0s      

2016-01-08 15:47:29 (137 MB/s) - `test.jpg' saved [20305/20305]

在该实例中,服务器端使用到了 4 个指令来控制缓存。

- Last-Modified:Fri,08 Jan 201607:25:26 GMT表示该文件的最后修改时间是 Fri,08 Jan 201607:25:26 GMT。客户端在后续需要请求该文件时,使用对应的请求头部 If-Modified-Since:Fri,08 Jan 201607:25:26 GMT 就可以验证服务器端文件是否发生变化。可以使用如下命令进行验证:

wget --header='If-Modified-Since: Fri, 08 Jan 2016 07:25:26 GMT' -S http://10.1.6.28/test.jpg

如服务器端文件未在此时间后发生变化,则服务器端不需要重新发送整个文件,而只需要发送“304 Not Modified”通知客户端即可。此时可以节省传输该文件的带宽和时间。

- ETag:"568f6466-4f51"相当于该静态资源的身份 ID。在 Web 服务器 Nginx 中,ETag 的值是基于文件的最后修改时间(时间戳)和文件大小(字节)计算出来的。浏览器在下一次请求该资源的过程中,使用 If-None-Match:"568f6466-4f51"即可确认该资源是否发生了变化。服务器端再次验证,如果未变化,则直接返回给客户端 HTTP/1.1304 Not Modified,而不需要再次传输整个文件,起到缓存的效果。如下所示:

#  wget --header='If-None-Match: "568f6466-4f51"' -S http://10.1.6.28/test.jpg
--2016-01-08 15:59:14--  http://10.1.6.28/test.jpg
Connecting to 10.1.6.28:80... connected.
HTTP request sent, awaiting response... 
  HTTP/1.1 304 Not Modified
  Server: nginx/1.9.7
  Date: Fri, 08 Jan 2016 07:59:14 GMT
  Last-Modified: Fri, 08 Jan 2016 07:25:26 GMT
  Connection: keep-alive
  ETag: "568f6466-4f51"
  Expires: Sat, 09 Jan 2016 07:59:14 GMT
  Cache-Control: max-age=86400
2016-01-08 15:59:14 ERROR 304: Not Modified.

- Expires:Sat,09 Jan 201607:47:28 GMT即服务器端通知客户端,在 Sat,09 Jan 201607:47:28 GMT 之前需要获取该资源时,不必再发起 HTTP 请求,直接使用这个缓存文件即可。

- Cache-Control:max-age=86400即服务器端通知客户端,你自收到这个文件起的 86400 秒内,都可以放心使用,不必再重复请求这个 URL。

注意

是对同一个意思的两种表示,前一个是绝对时间,后一个是相对时间。这两个指令同时使用时,max-age 优先起作用,因为有时客户端和服务器端的时钟并不完全一致,有时甚至差别较大,故使用相对值更加合理。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。