Firebase 当您的应用程序';s服务器托管在不同的云服务上

Firebase 当您的应用程序';s服务器托管在不同的云服务上,firebase,caching,cdn,firebase-hosting,google-cloud-run,Firebase,Caching,Cdn,Firebase Hosting,Google Cloud Run,我已经在长期缓存我的静态资产,如:css、图像、js文件等。由于这些文件在我的构建过程中都会得到内容哈希ID,因此我对它们的缓存方式如下: // STATIC FILES LIKE IMAGES, FONTS, CSS AND JS Cache-Control: "public,max-age=31536000" 通过这种方式,我可以获得长达一年的客户机和CDN缓存,这非常好。很好用 但是我的web应用程序是一个单页的React应用程序,因此每当我更新它时,我的用户从我的

我已经在长期缓存我的静态资产,如: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

下面是关于它的说明:

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

但问题是我的服务器托管在云上运行。Firebase主机基本上会重写对它的每个请求。比如:

firebase.json

"rewrites": [
  {
    "source": "**",
    "run": {
      "serviceId": "server",
      "region": "uscentral-1"
    }
  }
]
所以,每当我更新我的应用程序时,我都会将其重新部署到Cloud Run,但我不会运行新的
firebase部署——只运行hosting
命令。因为在云运行代码的新部署之间,我的
firebase.json
文件中没有任何更改


问题

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

假设新的云上部署运行不会触发CDN缓存的清除。我能做些什么来触发它吗?像一些
firebase部署——只托管:clearcdn
命令


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

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

如果您设置允许共享(CDN)缓存的
缓存控制
头,如
公共
无缓存
,您的响应将在客户端浏览器和CDN缓存上都缓存

  • 当您重新部署到云运行时,它会自动清除您的CDN缓存吗?
否。当您更新应用程序文件并将其重新部署到Cloud Run时,CDN上的那些缓存文件将过时,并且将不会自动从CDN中清除。因此,即使就Firebase托管而言没有任何变化,您也需要再次运行
Firebase部署--仅托管
。这将使CDN清除所有缓存文件,新请求将立即开始获取新数据

  • 我不确定缓存文件是否会被清除,因为我的Firebase主机/公用文件夹始终是空文件夹。因此Firebase主机可能会“感觉”什么都没有改变。
即使您的Firebase Hosting
public
文件夹中没有任何更改(在我的情况下,它是一个空文件夹),并且您的
Firebase.json
中没有任何更改,它仍将创建一个新的Firebase Hosting版本,并将从CDN中清除您的缓存文件,如所述:

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

关注动态内容

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

例如:CDN缓存
/blog/一些帖子
,其中
s-maxage为1天
。即使您动态更改了帖子的内容,CDN也会将CDN保留一整天,直到过期并再次收到请求为止