当您的应用服务器托管在不同的云服务上时,如何安全地受益于 Firebase 托管上的 CDN 缓存

How to safely benefit from CDN caching on Firebase Hosting when your app's server is hosted on a different Cloud service

我已经 long-term 缓存我的静态资产,例如:css、图像、js 文件等。因为这些文件都获得 content-hash ids 在我的构建过程中,我是这样对待它们的 cache-wise:

// STATIC FILES LIKE IMAGES, FONTS, CSS AND JS

Cache-Control: "public,max-age=31536000"

通过这种方式,我可以获得长达一年的客户端和 CDN 缓存,这很棒。一切正常。

但是我的网络应用程序是单页 React 应用程序,所以每当我更新它时,我的用户从我的应用程序获得的唯一 index.html 文件自动变得陈旧且无用,因为它指向旧的静态 JS文件,现已全部更新。

所以基本上我不能让他们变得陈旧 index.html 无论如何。

我还想从该文件的 CDN 缓存中获益。这是它可能变得棘手的时候。

现在,为了安全起见,我正在做的是:

// For index.html

Cache-Control: "no-cache, no-store, must-revalidate"

我正在考虑将其更改为:

// FOR index.html

Cache-Control: "max-age=0, s-maxage=86400, must-revalidate"

这样我就可以获得 1 天的 CDN 缓存,这很好。但我仍然不想冒险提供陈旧的 index.html.

这是 Firebase Hosting 对它的评价:

Any requested static content is automatically cached on the CDN. If you redeploy your site's content, Firebase Hosting automatically clears all your cached static content across the CDN until the next request.

但问题是我的服务器托管在云端 运行。并且 Firebase Hosting 基本上 rewrites 对它的每个请求。类似于:

firebase.json

"rewrites": [
  {
    "source": "**",
    "run": {
      "serviceId": "server",
      "region": "uscentral-1"
    }
  }
]

因此,每当我更新我的应用程序时,我都会 re-deploy 将其上传到云端 运行,但我不会 运行 新的 firebase deploy --only hosting 命令。因为我的 firebase.json 文件中没有任何内容更改 in-between 云的新部署 运行 代码。


问题

在这种情况下添加 s-maxage=86400 header 是否安全?

假设云上的新部署 运行 不会触发 CDN 缓存的清除。我可以做些什么来触发它吗?喜欢一些 firebase deploy --only hosting:clear-cdn 命令吗?

因为即使我再次 运行 firebase deploy --only hosting,我也不确定缓存文件是否会被清除,因为我的 Firebase Hosting /public 文件夹始终是一个空文件夹。因此 Firebase 托管可能“感觉”没有任何变化。

经过一天的测试,结果如下:

如果您设置 Cache-Control headers 将允许共享 (CDN) 缓存,例如 publicno-cache,您的响应将同时缓存在客户端浏览器上和 CDN 缓存。

  • 当你re-deploy到云运行时,它会自动清除你的CDN缓存吗?

没有。当您更新 re-deploy 您的应用程序文件到云端 运行 时,CDN 上的那些缓存文件将过时并且 不会 自动从 CDN 中清除。因此,即使就 Firebase 托管而言没有任何变化,您也需要再次 运行 firebase deploy --only hosting。这将使 CDN 清除所有缓存文件,新请求将立即开始获取新数据。

  • 我不确定缓存文件是否会被清除,因为我的 Firebase Hosting /public 文件夹始终是一个空文件夹。因此 Firebase 托管可能“感觉”没有任何变化。

即使您的 Firebase Hosting public 文件夹中没有任何内容发生变化(在我的例子中它是一个空文件夹)并且您的 firebase.json 中没有任何内容发生变化,它仍然会创建一个新的 Firebase Hosting 版本它将从 CDN 中清除您的缓存文件,如 doc 所说:

Any requested static content is automatically cached on the CDN. If you redeploy your site's content, Firebase Hosting automatically clears all your cached static content across the CDN until the next request.

关注动态内容

例如,如果您有要通过管理员编辑的动态内容 UI。请注意,CDN 缓存将保留该内容的陈旧缓存,直到它过期。

例如:CDN 缓存 /blog/some-posts-maxage of 1 day。即使您动态更改 post 的内容,CDN 也会保留 CDN 一整天,直到它过期并再次被请求。