Firebase 托管:没有尾部斜杠时重写规则失败

Firebase hosting: rewrite rule failing when there is no trailing slash

我在 Firebase 托管中托管两个 SPA(分别构建)。我的构建过程生成如下目录结构:

/build
|
|-- index.html
|-- scripts.js
|-- style.css
|
|--- /app
     |
     |-- index.html
     |-- scripts.js
     |-- style.css

如果我连接我的域 example.com,我希望 https://example.com 为第一个 SPA 提供服务,https://example.com/app 为第二个 SPA 提供服务。

此外,如果文件不存在,我希望 https://example.com/xxx 形式的每个地址都被重写为 https://example.com/index.html,同样,指向 https://example.com/app/xxx 的所有内容都被重写至 https://example.com/app/index.html.

我设法让它与以下配置一起工作:

{
  "hosting": {
    "public": "build",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "app/**",
        "destination": "/app/index.html"
      },
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}

但是现在,当我去 https://example.com/app WITHOUT SLASH 时,它服务于 "root" SPA。如果我转而使用 https://example.com/app/ WITH SLASH,它会按应有的方式为 "nested" SPA 提供服务。

如何让 https://example.com/app 服务于 "nested" SPA?

我尝试了什么

对我做错了什么有什么想法吗?

看起来没有办法用一个重写规则来做到这一点。

您需要添加两个重写,一个用于 app,另一个用于 app/

"rewrites": [
    {
        "source": "/app",
        "destination": "/app/index.html"
    },
    {
        "source": "/app/**",
        "destination": "/app/index.html"
    },
    {
        "source": "**",
        "destination": "/index.html"
    }
]

其实是有办法的:

"rewrites": [{
  "source": "/api{,/**}",
  // destination | run | function
}]