首页 > 解决方案 > 当您的应用服务器托管在不同的云服务上时,如何安全地从 Firebase 托管上的 CDN 缓存中受益

问题描述

我已经长期缓存我的静态资产,例如:css、图像、js 文件等。由于这些文件在我的构建过程中都获得了内容哈希 id,这就是我对待缓存的方式:

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

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

这样我就可以获得长达一年的客户端和 CDN 缓存,这很棒。它工作正常。

但是我的 Web 应用程序是单页 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 托管对此的评价:

任何请求的静态内容都会自动缓存在 CDN 上。如果您重新部署网站的内容,Firebase 托管会自动清除 CDN 中所有缓存的静态内容,直到下一次请求。

在此处输入图像描述

但问题是我的服务器托管在 Cloud Run 上。Firebase Hosting 基本上rewrites是对它的每个请求。就像是:

firebase.json

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

因此,每当我更新我的应用程序时,我都会将其重新部署到 Cloud Run,但我不会运行新firebase deploy --only hosting命令。因为在 Cloud Run 代码的新部署之间,我的firebase.json文件中没有任何变化。


问题

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

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

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

标签: firebasecachingcdnfirebase-hostinggoogle-cloud-run

解决方案


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

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

  • 当您重新部署到 Cloud Run 时,它会自动清除您的 CDN 缓存吗?

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

  • 我不确定缓存文件是否会被清除,因为我的 Firebase Hosting /public 文件夹始终是一个空文件夹。所以 Firebase Hosting 可能会“感觉”到什么都没有改变。

即使您的 Firebase Hostingpublic文件夹中的任何内容都没有更改(在我的情况下,它是一个空文件夹)并且您的任何内容都没有firebase.json更改,它仍然会创建一个新的 Firebase Hosting 版本,并且它会从 CDN 中清除您的缓存文件,就像文档说的那样:

任何请求的静态内容都会自动缓存在 CDN 上。如果您重新部署网站的内容,Firebase 托管会自动清除 CDN 中所有缓存的静态内容,直到下一次请求。

关注动态内容

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

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


推荐阅读