可缓存响应是一种可供 Cloud CDN 存储并快速检索,因而有助于缩短加载时间的 HTTP 响应。并非所有 HTTP 响应都可以缓存。
缓存模式
使用缓存模式,您可以控制用于确定 Cloud CDN 是否缓存内容的因素。
Cloud CDN 提供三种缓存模式,其中定义了响应的缓存方式、Cloud CDN 是否遵循源站发送的缓存指令,以及缓存 TTL 的应用方式。
下表显示了可用的缓存模式:
| 缓存模式 | 行为 |
|---|---|
CACHE_ALL_STATIC |
自动缓存包含不是不可缓存的静态内容的成功响应。设置有效缓存指令的源站响应也会进行缓存。 对于使用 Google Cloud CLI 或 REST API 创建的启用了 Cloud CDN 的后端,这是默认行为。 |
USE_ORIGIN_HEADERS |
要求成功的源站响应设置有效的缓存指令和有效的缓存标头。没有这些指令的成功响应会从源站转发。 |
FORCE_CACHE_ALL |
无条件缓存成功响应,并跳过源站设置的任何缓存指令。如果后端传送每个用户的非公开(可识别用户个人身份信息)内容(例如动态 HTML 或 API 响应),则此模式不适用。 |
即使缺少有效的缓存指令,错误响应也可能缓存。
在将缓存模式设置为 FORCE_CACHE_ALL 之前,请考虑以下行为:
对于签名网址或签名 Cookie,
FORCE_CACHE_ALL会替换通过 Google Cloud 控制台中的缓存条目存在时间上限设置或gcloud --signed-url-cache-max-age选项指定的存在时间上限。FORCE_CACHE_ALL会更改任何先前缓存内容的存留时间 (TTL)。此更改可能会导致某些之前被视为新鲜的条目(由于源标头中的 TTL 较长)被视为过时,并可能导致某些之前被视为过时的条目被视为新鲜。FORCE_CACHE_ALL会替换缓存指令(Cache-Control和Expires),但不会替换其他源响应标头。特别是,即使缓存模式为FORCE_CACHE_ALL,Vary标头也可能会禁止缓存。如需了解详情,请参阅 Vary 标头。
如需查看设置说明,请参阅设置缓存模式。
静态内容
静态内容是始终相同的内容,即使由不同的用户访问这些内容也是如此。用于给网站设置样式的CSS 以及用于提供交互性、视频和图片内容的 JavaScript,通常不会针对每个用户更改给定网址(缓存键),因此可以从 Cloud CDN 的全球边缘网络缓存受益。
如果您将缓存模式设置为 CACHE_ALL_STATIC,并且响应在 Cache-Control 或 Expires 标头中没有显式缓存指令,则 Cloud CDN 会自动缓存以下内容的该响应:
- Web 资源,包括 CSS (
text/css)、JavaScript (application/javascript) 以及包括 WOFF2 (font/woff2) 在内的所有 Web 字体 - 图片,包括 JPEG (
image/jpg) 和 PNG (image/png) - 视频,包括 H.264、H.265 和 MP4 (
video/mp4) - 音频文件,包括 MP3 (
audio/mpeg) 和 MP4 (audio/mp4) - 格式化文档,包括 PDF 文件 (
application/pdf)
下表进行了总结。
| 类别 | MIME 类型 |
|---|---|
| Web 资源 | text/css text/ecmascript text/javascript application/javascript |
| 字体 | 与 font/* 相匹配的所有 Content-Type |
| 图片 | 与 image/* 相匹配的所有 Content-Type |
| 视频 | 与 video/* 相匹配的所有 Content-Type |
| 音频 | 与 audio/* 相匹配的所有 Content-Type |
| 格式化文档类型 | application/pdf 和 application/postscript |
Cloud CDN 检查 Content-Type HTTP 响应标头,该标头反映所传送内容的 MIME 类型。
注意事项:
您的源站 Web 服务器软件必须为每个响应设置
Content-Type。许多 Web 服务器会自动设置Content-Type标头,包括 NGINX、Varnish 和 Apache。使用 Google Cloud 控制台或 Google Cloud CLI 上传内容时,Cloud Storage 会自动设置
Content-Type标头。Cloud Storage 始终向 Cloud CDN 提供
Cache-Control标头。如果未明确选择值,它会发送默认值。 因此,除非您在 Cloud Storage 中明确调整了对象的缓存控制元数据,或使用FORCE_CACHE_ALL模式替换 Cloud Storage 发送的值,否则所有成功的 Cloud Storage 响应都会根据 Cloud Storage 默认值进行缓存。如果您要缓存
text/html和application/json内容类型,则必须在响应中设置显式Cache-Control标头,以避免意外缓存某个用户的数据,并将其传送给所有用户。
如果某个响应的 MIME 类型支持进行缓存,但 Cache-Control 响应标头为 private 或 no-store,或标头为 Set-Cookie,则系统不会缓存该响应。如需了解详情,请参阅可缓存性规则。
HTML (text/html) 和 JSON (application/json) 等其他内容类型默认不会针对成功响应进行缓存。这些类型的响应通常是动态的(每个用户)。例如购物车、具有用户个性化的商品页面以及经过身份验证的 API 响应。但是,负缓存(如果启用)仍可能会导致它们针对某些状态代码进行缓存。
Cloud CDN 不会使用网址路径中的文件扩展名来确定响应是否可缓存,因为很多有效的可缓存响应没有反映在网址中。
可缓存的内容
Cloud CDN 会缓存满足本部分所列全部要求的响应。其中一些要求是 RFC 7234 中规定的,而其他要求则专门针对 Cloud CDN。
Cloud CDN 可能会定期更改其用于缓存内容的具体条件集。如果要明确阻止 Cloud CDN 缓存您的内容,请遵循 RFC 7234 中的准则,以确定如何指定保证不可缓存的响应。另请参阅基于源标头的不可缓存内容部分。
如果满足以下所有条件,则 Cloud CDN 会将响应存储在缓存中:
| 属性 | 要求 |
|---|---|
| 来源 | 已启用 Cloud CDN 的后端服务、后端存储桶或外部后端 |
| 所响应的请求 | GET 请求 |
| 状态代码 |
|
| 时效性 | 响应具有含 对于没有存在时间的可缓存响应(例如具有 |