当我更改路径时,基于 AWS ALB 目标组路径的路由不起作用

时间:2021-02-09 16:53:12

标签: amazon-web-services amazon-ecs aws-application-load-balancer

编辑

我发现在 /cms 下向节点应用程序添加路由似乎可以解决该问题,但是,我如何将 / 指向默认值。这似乎是令人讨厌的行为

结束编辑

我有一个运行一个任务的 ECS 集群,这是由一个目标组选择的,在 ALB 上我在 / 上路由到这个目标组,如下所示:

enter image description here

然后当我从 ALB 获取 DNS 并点击它工作正常的 url 时,我得到:

{"name":"DEMO"}

我也希望仅在用户点击 /cms 时才路由此服务,因此我在侦听器中进行了更改,如下所示:

enter image description here

但是一旦更新,我点击了 url + /cms 我得到:

Cannot GET /cms

我不知道为什么。这是一个超级基础的节点快递应用,索引如下:

const express = require('express')
const app = express()
const port = 80

app.get('/', (req, res) => {
    let data = {
        name: "DEMO"
    }
    res.json(data);
})

app.listen(port, () => {
    console.log(`Example app listening at http://localhost:${port}`)
})

1 个答案:

答案 0 :(得分:1)

HTTP 请求是:

http://yourdomen/[path]/[subpath]

其中: [path] - 无论是 /cms 还是 /

存在负载均衡器转发行为:

  • 如果负载均衡器得到 http://yourdomen/,它会将 http://yourdomen/ 传递给 Express(不是 /
  • 如果负载均衡器得到 http://yourdomen/cms,它还会将“http://yourdomen/cms”传递给 Express 而不做任何更改(不是 /cms
  • 如果负载均衡器获得 http://yourdomen/cms/[subpath],则通过 http://yourdomen/cms/[subpath] /cms/[subpath]

负载均衡器不能在 “转发到” 操作中仅将 subpath 部分传递给 Express。如果您想在将请求传递给 Express 之前让负载均衡器更改您的请求,您应该使用 “重定向到” 操作

注意您可以在重定向规则中使用 ECS 集群私有 DNS 作为主机,这样您就不需要目标组

重定向示例:

负载均衡器获取 http://yourdomen/cms/[subpath] 并将请求的路由更改为 http://dummycmsdomen/[subpath] 并将此更新的路由重定向到 Express。在这种情况下,Express 将获得 http://yourdomen/[path] 模式,并在您的场景中正常工作

版本部分答案:

  • 如果您发送 http://yourdomen/,那么 Express 应该使用 / 路径
  • 如果您发送 http://yourdomen/cms,那么 Express 应该使用 /cms 路径

因此,在您编辑代码 Express 应用程序之前,它正在等待 / 路径,但它获得 /cms 并且应该返回 GET 错误。 在您添加了相应的指令来处理 /cms 路径后,应用程序开始工作