缓存应用内容

Cloud CDN 是 App Hosting 对 Web 应用支持的重要组成部分。对后端的每个 请求都首先通过 Cloud CDN。CDN 中已缓存的内容会立即传送回用户,从而跳过对运行 Web 应用服务器代码的 Cloud Run 服务的访问。如需详细了解 CDN 的一般优势,请访问 web.dev

虽然基本 Cloud CDN 配置由 App Hosting 设置且无法 修改,但您可以执行多项操作来优化缓存,以 提高网页加载速度、减少计费的未缓存内容并最大限度地减少 对 Cloud Run 的流量。

可缓存的内容

如果满足以下所有 条件,则 Cloud CDN 会将响应存储在缓存中:

  1. 请求为 GET

  2. 响应的状态代码为 200203204206300301302307308404405410421451501

  3. 响应具有含 max-ages-maxage 指令的 Cache-Control 标头,或者具有带未来时间戳的 Expires 标头。

  4. 响应具有 Age 标头或具有含显式 public 指令的 Cache-Control 标头。

  5. 响应大小不超过 10 MiB。

并且以下条件均不 成立:

  1. 响应具有 Set-Cookie 标头

  2. 响应具有 Vary 标头,其值不是 AcceptAccept-EncodingAccess-Control-Request-HeadersAccess-Control-Request-MethodOriginSec-Fetch-DestSec-Fetch-ModeSec-Fetch-SiteX-Goog-Allowed-ResourcesX-OriginRSCNext-Router-State-TreeNext-Router-PrefetchNext-Router-Segment-Prefetch

  3. 响应具有含 no-storeprivate 指令的 Cache-Control 标头。

  4. 请求具有含 no-store 指令的 Cache-Control 标头。

  5. 请求具有 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-ages-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 > 使用情况 标签页中,Firebase 控制台中的 “Cloud CDN - 出站带宽”图表显示了传送的缓存和未缓存字节数, 并且每个发布版本都有一个标记。您可以使用此图表来衡量缓存优化工作的有效性。

您还可以使用 基于路由的监控功能查看 Web 应用中特定路由的缓存命中率。