Cloud CDN 是 App Hosting 对 Web 应用提供支持的重要组成部分。对后端的每个请求都会先经过 Cloud CDN。已缓存在 CDN 中的内容会立即返回给用户,而无需访问运行 Web 应用服务器代码的 Cloud Run 服务。如需详细了解 CDN 的常规优势,请访问 web.dev。
虽然基本 Cloud CDN 配置由 App Hosting 设置且无法修改,但您可以通过多种方式优化缓存,以提高网页加载速度、减少未缓存内容的计费次数,并最大限度地减少 Cloud Run 的流量。
可缓存的内容
如果满足以下所有条件,则 Cloud CDN 会将响应存储在缓存中:
请求是 GET
响应的状态代码为
200
、203
、204
、206
、300
、301
、302
、307
、308
、404
、405
、410
、421
、451
或501
。响应具有含
max-age
或s-maxage
指令的Cache-Control
标头,或者具有带未来时间戳的Expires
标头。响应具有
Age
标头或包含显式public
指令的Cache-Control
标头。响应大小小于或等于 10 MiB。
且不满足以下任何条件:
响应具有
Set-Cookie
标头响应具有
Vary
标头,其值不是Accept
、Accept-Encoding
、Access-Control-Request-Headers
、Access-Control-Request-Method
、Origin
、Sec-Fetch-Dest
、Sec-Fetch-Mode
、Sec-Fetch-Site
、X-Goog-Allowed-Resources
、X-Origin
、RSC
、Next-Router-State-Tree
、Next-Router-Prefetch
或Next-Router-Segment-Prefetch
。响应具有含
no-store
或private
指令的Cache-Control
标头。请求具有带
no-store
指令的Cache-Control
标头。请求具有
Authorization
标头,除非响应具有显式缓存控制指令。
使用缓存控制指令自定义行为
Next.js
Next.js 会根据多种因素隐式设置缓存控制指令。不过,您可以在 next.config.js
文件中手动设置标头,以覆盖这些标头。例如,若要确保某个网页不会在 Cloud CDN 中缓存,请执行以下操作:
/** @type {import('next').NextConfig} */
const nextConfig = {
headers: async () => [{
source: "/YOUR_PRIVATE_PAGE",
headers: [{
key: "Cache-Control",
value: "private"
}],
}],
};
Angular
Angular SSR 不会在开箱即用时设置显式缓存控制指令。您可以在服务器路线中指定缓存控制标头,以添加自己的缓存控制标头。例如,若要允许 Cloud CDN 将所有网页缓存一小时,请执行以下操作:
import { RenderMode, ServerRoute } from '@angular/ssr';
export const serverRoutes: ServerRoute[] = [
{
path: '**',
renderMode: RenderMode.Prerender,
headers: {
'Cache-Control': 'public, max-age=3600',
}
}
];
或者,如需确保特定网页不会被缓存,请执行以下操作:
import { RenderMode, ServerRoute } from '@angular/ssr';
export const serverRoutes: ServerRoute[] = [
// ... other routes
{
path: 'YOUR_PRIVATE_PAGE',
renderMode: RenderMode.Server,
headers: {
'Cache-Control': 'private',
}
}
];
受尊重的指令
Firebase App Hosting 的 Cloud CDN 实例会遵循以下缓存控制指令:
指令 | 请求 | 响应 |
---|---|---|
no-store |
如果请求中存在该指令,则系统不会缓存响应。 | 系统不会缓存具有 no-store 的响应。 |
no-cache |
系统会忽略 no-cache 请求指令,以防止客户端可能向来源发起或强制重新验证。 |
系统会缓存具有 no-cache 的响应,但必须在传送前使用来源重新验证该响应。 |
public |
不适用 | 此指令不是可缓存性所必需的,但最佳做法是将它包含在应由代理缓存的内容中。 |
private |
不适用 | 具有 private 指令的响应不会被 Cloud CDN 缓存,即使该响应被视为可缓存也是如此。客户端(如浏览器)可能仍会缓存结果。使用 no-store 可阻止响应的所有缓存。 |
max-age=SECONDS |
系统会忽略 max-age 请求指令。返回缓存的响应就像此标头未包含在请求中一样。 |
具有 max-age 指令的响应缓存时间长达定义的 SECONDS。 |
s-maxage=SECONDS |
不适用 | 具有 s-maxage 指令的响应缓存时间长达定义的 SECONDS。如果同时存在 max-age 和 s-maxage ,则 Cloud CDN 会使用 s‑maxage 。具有此指令的响应不会过时传送。s-max-age (两个连字符)对缓存无效。 |
max-stale=SECONDS |
max-stale 请求指令指示客户端愿意接受的过时上限(以秒为单位)。Cloud CDN 会采用此指令,并且仅在响应过时小于 max-stale 指令时才会返回过时缓存的响应。否则,Cloud CDN 会在处理请求前进行重新验证。 |
不适用 |
stale-while-revalidate=SECONDS |
不适用 | 具有 stale-while-revalidate 的响应传送至客户端的时间长达 SECONDS,同时异步执行重新验证。 |
must-revalidate |
不适用 | 具有 must-revalidate 的响应会在到期后使用源服务器进行重新验证。具有此指令的响应不会过时传送。 |
proxy-revalidate |
具有 proxy-revalidate 的响应会在到期后使用源服务器进行重新验证。具有此指令的响应不会过时传送。 |
|
no-transform |
不适用 | Cloud CDN 不会应用任何转换。 |
衡量缓存的流量和未缓存的流量
App Hosting 控制台的用量标签页中的“Cloud CDN - 出站带宽”图表会显示已缓存和未缓存的传输字节数,并会为每次发布添加标记。您可以使用此图表衡量缓存优化工作的效果。