如何解决当您的应用服务器托管在不同的云服务上时,如何安全地从 Firebase 托管上的 CDN 缓存中受益
我已经长期缓存我的静态资产,例如:css、图像、js 文件等。由于这些文件在我的构建过程中都获得了 content-hash id,这就是我的处理方式他们缓存:
// 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 对此的评价如下:
任何请求的静态内容都会自动缓存在 CDN 上。如果您重新部署网站的内容,Firebase 托管会自动清除 CDN 中所有缓存的静态内容,直到下一个请求。
但问题是我的服务器托管在 Cloud Run 上。 Firebase 托管基本上是 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 Hosting /public
文件夹始终是一个空文件夹。因此 Firebase 托管可能会“感觉”没有任何变化。
解决方法
经过一天的测试,结果如下:
如果您设置了允许共享 (CDN) 缓存的 Cache-Control
标头,例如 public
或 no-cache
,您的响应将在客户端浏览器和 CDN 缓存中缓存。
- 当您重新部署到 Cloud Run 时,它会自动清除您的 CDN 缓存吗?
没有。当您更新应用文件并将其重新部署到 Cloud Run 时,CDN 上的这些缓存文件将是陈旧的,并且不会从 CDN 中自动清除。因此,即使就 Firebase 托管而言没有任何变化,您也需要再次运行 firebase deploy --only hosting
。这将使 CDN 清除您所有的缓存文件,新请求将立即开始获取新数据。
- 我不确定缓存文件是否会被清除,因为我的 Firebase Hosting /public 文件夹始终是一个空文件夹。因此,Firebase 托管可能会“感觉”没有任何变化。
即使您的 Firebase Hosting public
文件夹中没有任何内容发生变化(在我的情况下它是一个空文件夹)并且您的 firebase.json
中没有任何内容发生变化,它仍然会创建一个新的 Firebase Hosting 版本并且它将从 CDN 中清除您的缓存文件,如 doc 所说:
任何请求的静态内容都会自动缓存在 CDN 上。如果您重新部署网站的内容,Firebase 托管会自动清除 CDN 中所有缓存的静态内容,直到下一个请求。
注意动态内容
例如,如果您有要通过管理 UI 编辑的动态内容。请注意,CDN 缓存将保留该内容的陈旧缓存,直到过期。
例如:CDN 缓存 /blog/some-post
和 s-maxage of 1 day
。即使您动态更改帖子的内容,CDN 也会将 CDN 保留一整天,直到它过期并再次被请求。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。