Firebase 托管缓存 ​​Google 云 运行 请求

Firebase hosting caches Google Cloud Run requests

所以我正在尝试使用 Firebase 托管和 Google 云 运行 来构建 Web 应用程序。

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

我的 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 云 运行 服务处理。然而,我开始注意到一些请求的奇怪行为,因为服务器返回的响应完全不是我所期望的。 进一步调查,我注意到这些请求没有显示在我的云 运行 服务的日志中。

所以我检查了浏览器收到的响应 header,发现响应来自 Firebase 缓存而不是云 运行 服务:

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 状态:

However, because Cloud Functions and Cloud Run services generate content dynamically, the content for a given URL can vary based on such things as user input or the user's identity. To account for this, requests that are handled by backend code do not cache on the CDN by default.

所以我希望 none 发送到 /api 的请求永远被缓存。 我定义重写规则的方式是否有问题,或者我是否应该将此视为 Firebase 托管处理云 运行 路由的方式中的一个问题?

更新

这里是客户端请求的详细信息,如 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

请求returnsJSON数据,这里是Cloud运行实际处理后,后台返回的responseheaders运行:

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

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

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

例如:

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