firebase - 当您的应用服务器托管在不同的云服务上时,如何安全地从 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 可能会“感觉”到什么都没有改变。
解决方案
经过一天的测试,结果如下:
如果您设置Cache-Control
允许共享 (CDN) 缓存的标头,例如public
or 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 保留一整天,直到它过期并再次被请求。
推荐阅读
- python - Python runtime.txt 指定 Python 运行时版本
- heroku - Heroku 部署 jar 问题
- consul - 领事快照还原后保险库无法自动解封
- r - 无法成功构建 rocker/r-apt 映像 NO GPG KEY found
- r - R - 将二维向量转换为一维命名向量
- r - 如何准确确定加载的库来自哪个 libpath?
- c# - Is there a way to add data into a specific row c#
- scala - Any difference between left anti join and except in Spark?
- c++ - const uint32_t gives the error: hicpp bitwise operations on signed integers
- laravel - Laravel pluck with paginate