什么是缓存控制?缓存说明

缓存控制决定网站的缓存行为,让浏览器知道应以多少频率刷新本地存储的资源。

Share facebook icon linkedin icon twitter icon email icon

缓存控制

学习目标

阅读本文后,您将能够:

  • 定义访问控制
  • 描述浏览器缓存
  • 概述几个缓存控制指令

什么是缓存控制?

缓存控制是一种 HTTP 标头,指定浏览器的缓存行为。简而言之,当某人访问网站时,其浏览器将在称为缓存的存储中保存某些资源,例如图像和网站数据。当该用户重新访问同一网站时,缓存控制设置的规则会确定该用户是否从本地缓存中加载这些资源,或者浏览器是否必须向服务器发送新资源的请求。若要更深入地了解缓存控制,需要对浏览器缓存和 HTTP 标头有基本的认识。

什么是浏览器缓存?

如上文所述,浏览器缓存是指 Web 浏览器保存网站资源,以便不必再次从服务器获取它们。例如,网站上的背景图像可以保存到本地缓存中,这样在用户第二次访问该页面时,该图像将从用户的本地文件加载,页面就能以更快的速度加载加。

浏览器只会在指定的时间段里保留这些资源,这称为生存时间(TTL)。如果 TTL 过期后用户请求缓存的资源,浏览器必须再次与服务器联系并下载该资源的新副本。浏览器和 Web 服务器如何知道每一资源的 TTL?这是 HTTP 标头的用武之地。

什么是 HTTP 标头?

超文本传输协议(HTTP)概述了万维网上通信的语法,此通信由客户端对服务器的请求和服务器对客户端的响应构成。这些 HTTP 请求和响应各自带有一系列称为标头的键值对。

这些标头包含有关每次通信的许多重要信息。例如,请求标头通常包含:

  1. 有关请求了什么资源的信息
  2. 客户端正在使用哪一浏览器
  3. 客户端会接受哪些数据格式

响应标头通常包含以下信息:

  1. 请求是否成功得到满足
  2. 响应主体中任何资源的语言和格式。

缓存控制标头可以出现在 HTTP 请求和响应中。

什么是缓存控制标头?

标头由通过冒号分隔的键值对构成。对于缓存控制,“键”或冒号左侧的部分始终为“cache-control”。“值”是在冒号右侧的内容,可以有一个或几个逗号分隔的值来用于缓存控制。

Example Cache Control Header

这些值称为指令,指定谁可以缓存资源,以及在必须更新资源之前这些资源可以缓存的时间。下面我们介绍一些最常见的缓存控制指令:

cache-control: private

具有“private”指令的响应只能由客户端缓存,不能由中间代理(例如 CDN或代理)缓存。这些资源通常是包含私密数据的资源,例如显示用户个人信息的网站。

cache-control: public

相反,“public”指令表示资源可以由任何缓存存储。

cache-control: no-store

带有“no-store”指令的响应无法缓存到任何位置,也永不缓存。也就是说,用户每次请求此数据时,都必须将请求发送到源站服务器以获取新副本。此指令通常保留给包含极其敏感数据的资源,例如银行帐户信息。

cache-control: no-cache

此指令表示,只有先检查有无更新版本后,才可使用所请求资源的缓存版本。这通常使用 ETag 来完成。

ETag 是另一种 HTTP 标头,其中包含一个特定于请求之时资源版本的令牌。每当资源更新时,此令牌会源站服务器上更改。

每次用户返回到具有“no-cache”资源的页面时,客户端都必须连接到源站服务器,并将已缓存资源上的 ETag 与服务器上的 ETag 进行比较。如果 ETag 相同,则向用户提供缓存的资源。否则表示资源已经更新,客户端需要下载新版本以提供给用户。此过程可确保用户始终获得资源的最新版本,并且无需进行不必要的下载。

cache-control: max-age

此指令指定了生存时间,也就是资源在下载后可以从缓存服务多少秒钟。例如,如果将最大期限设置为 1800,则首次从服务器请求资源后的 1800 秒(30 分钟)内,后续请求都会向用户提供该资源的缓存版本。如果 30 分钟后用户再次请求资源,则客户端必须向源站服务器请求新副本。

“s-maxage”指令专门用于 CDN 等共享缓存,指定这些共享缓存能够在多长时间内持续从缓存中提供资源。该指令会覆盖各个客户端的“max-age”指令。

为什么缓存控制很重要?

浏览器缓存是一种既可以保留资源又能改善 Internet 上用户体验的好方法,但若没有缓存控制,它会非常脆弱。各个站点上的每一资源都受到相同缓存规则的约束;也就是说,敏感信息和公共信息会以相同的方式进行缓存,频繁更新的资源也与很少更改的资源缓存同样的时间。

缓存控制可以增加灵活性,让浏览器缓存真正发挥作用,使开发人员能够决定如何缓存每种资源。它还允许开发人员为中介设置特殊规则,这就是为什么使用 CDN 的网站(例如Cloudflare CDN )的性能一般要胜于不使用 CDN 的网站。