配置类似反向代理的 Firebase 托管解决方案

Configuring a reverse-proxy-like Firebase Hosting solution

这是我目前拥有的

domain.com ->  website A with its own firebase host (domain.firebase.com)
me.domain.com -> website B with its own firebase host (domain-me.firebase.com)

这并不难设置,只是多个子域重定向到不同的 Firebase 主机。现在,我 想要的 是一个反向代理接受请求并可以选择将流量路由到各种服务器,同时保持客户端 URL 仅在 [= 的主域上23=]domain.com。我不确定这是否可行特别是对于 Firebase,因为有大量的 NGINX 实现示例,但基本上,我想要这个:

domain.com/ ->  website A with its own firebase host (domain.firebase.com)
domain.com/me -> website B with its own firebase host (domain-me.firebase.com)

Firebase 有非常复杂的重定向选项,但重定向也会覆盖客户端 URL。因此,通过重定向,客户端将看到 domain-me.firebase.com 而不是 domain.com/me,这不是我想要什么。

据我所知,我可以使用 Firebase 云功能作为中间件,并根据需要让它为任一站点提供服务。但是,这会引入大量延迟,因为云函数和 Firebase 托管网站都有从冷启动开始的预热时间。

不给我一个完整详细的答案也没关系,我真的只是想知道这是否可以开始,以及在哪里可以找到相关资源。谢谢!

Cloud Functions and Cloud Run are pretty much your only options here. There's nothing in the config that will let you proxy your requests directly to other endpoints other than indirectly through HTTP redirects 集成。

回答我自己的问题并基于 Doug 关于使用云的回答 运行。有一种快速而轻松的方法可以使用 2 个应用程序设置类似反向代理的实现。为此:

1) 构建两个应用程序并将它们放在单独的文件夹中,例如文件夹 A 和文件夹 B。您只需要应用程序的构建文件夹,不需要源代码。

2) 在文件夹 A 和 B 的根目录下创建一个新的 Express 应用程序。

3) 让 Express 使用 app.get 管理路由并使用 res.sendFile 返回文件。

4) 按照 Google 的教程 here 将整个 Express 应用程序容器化,您可以忽略示例应用程序,因为您的新 Express 应用程序 申请。

5) 作为一项新服务上传到云端 运行。请记住,虽然 Google tuts 没有指定,但您 需要授予您的用户上传到存储桶的权限。你将需要命令 gsutil iam ch user:[user]:objectViewer gs://us.artifacts.[project-name].appspot.com 如果您有多个项目,请确保使用命令 gcloud config set project [project-name] 切换到当前项目。

6) 使用 Google 域映射映射到您的 root 域,因此 domain.com.

必须使用域映射,因为 Cloud 运行 使用的 URL 是短暂的...因为它是无服务器的。

您的文件夹结构应该类似于

my-awesome-project
    index.js <- Express app and Docker entry point
    /package.json <- for your Express app
    /A
    /B
    /Dockerfile
    /node_modules

示例路由器是

app.get('/me/*', (req,res) =>{
    res.sendFile(path.join(__dirname+'/B/index.html'));
});

app.get('/*', (req,res) =>{
    res.sendFile(path.join(__dirname+'/A/index.html'));
});

在子域上设置您的应用程序的工作方式几乎相同。使用第 4 步将每个单独的应用程序容器化,然后使用 Google 域映射分别映射每个域。