【问题标题】:Firebase hosting caches Google Cloud Run requestsFirebase 托管缓存 ​​Google Cloud Run 请求
【发布时间】:2020-03-02 22:05:50
【问题描述】:

所以我正在尝试使用 Firebase 托管和用于 Web 应用程序的 Google Cloud Run。

我在 firebase 主机上部署了一个静态 SPA,以及一个重写规则,用于将所有以 /api 开头的请求定向到我的 Google Cloud Run 服务。

我的 firebase.json 文件如下所示:

{
  "hosting": {
    "public": "dist",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**/api/**",
        "run": {
          "serviceId": "myservice-api",  
          "region": "europe-west1"     
        }
      },
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}

起初,一切似乎都按预期工作,所有 /api 请求都由我的 Google Cloud Run 服务处理。但是我开始注意到一些请求的奇怪行为,因为服务器返回的响应根本不是我所期望的。 进一步研究后,我注意到这些请求没有显示在我的 Cloud Run 服务的日志中。

所以我检查了浏览器收到的响应标头,发现响应来自 Firebase 缓存而不是 Cloud Run 服务:

accept-ranges: bytes
access-control-allow-origin: *
content-length: 245
content-type: application/json
date: Wed, 06 Nov 2019 11:24:32 GMT
server: Google Frontend
status: 200
vary: x-fh-requested-host, accept-encoding
x-cache: HIT
x-cache-hits: 5
x-served-by: cache-cdg20776-CDG

documentation 声明:

但是,由于 Cloud Functions 和 Cloud Run 服务会动态生成内容,因此给定 URL 的内容可能会因用户输入或用户身份等因素而异。考虑到这一点,由后端代码处理的请求默认情况下不会缓存在 CDN 上。

所以我希望不会缓存任何去往 /api 的请求。 我定义重写规则的方式是否有问题,或者我是否应该将此视为 Firebase 托管处理 Cloud Run 路由的方式的问题?

更新

这是客户端请求的详细信息,如 Chrome 开发工具中所示:

Request URL: https://myproject.web.app/api/users/me
Request Method: GET

Headers:
:authority: myproject.web.app
:method: GET
:path: /api/users/me
:scheme: https
accept: application/json;charset=UTF-8
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9,fr;q=0.8
authorization: Bearer xxx
cookie: G_ENABLED_IDPS=google; G_AUTHUSER_H=0
referer: https://myproject.web.app/auth/login/
sec-fetch-mode: cors
sec-fetch-site: same-origin
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36

请求返回 JSON 数据,这里是 Cloud Run 实际处理时后端返回的响应头:

content-type: application/json
access-control-allow-origin: *
X-Cloud-Trace-Context: eeb4c0dbd22dd46f3c42fbe0b85b6420;o=1
Date: Wed, 06 Nov 2019 11:24:26 GMT
Server: Google Frontend
Content-Length: 240

因此服务器没有设置特定的标头指示应缓存响应。

【问题讨论】:

  • 您的客户端请求和服务器响应到底是什么?您的后端是否发送指示结果可缓存的标头?
  • @DougStevenson 我已经用有关客户端请求和服务器响应的信息更新了我的帖子。
  • 我有一个非常相似的问题:stackoverflow.com/questions/69436670/…

标签: firebase firebase-hosting google-cloud-run


【解决方案1】:

我找到了解决方案...我在标题中添加了 Cache-Control 属性并添加了两个“no-cache”和“no-store”值

例如:

"headers": [
      { "source":"**/user/**", "headers": [{"key": "Cache-Control", "value": "no-cache, no-store"}] }
    ]

【讨论】:

  • 您能否编辑您的答案以澄清您正在编辑firebase.json?甚至可以添加一些结构,例如{ "hosting": { "headers": [...], ...} }
猜你喜欢
  • 2016-12-05
  • 2020-06-24
  • 2019-09-10
  • 2020-10-26
  • 2020-10-12
  • 2020-10-01
  • 1970-01-01
  • 2019-10-23
  • 2021-12-06
相关资源
最近更新 更多