使用 cloudflare 将请求路由到不同的 Web 应用程序



我目前有两个在cloudflare中设置的Web应用程序,具有以下CNAME。两者都是keystonejs应用程序。

app1.example.com ===pointing to ===> AWS ALB 1
app2.example.com ===pointing to ===> AWS ALB 2

我已设置 Cloudflare Enterprise,因此我可以在页面规则中使用"渲染覆盖"功能。我使用以下方法设置了 2 个页面规则:

www.example.com ===render override ===> app1.example.com
www.example.com/app2/* ===render override ===> app2.example.com

现在为了访问 app2.example.com 上的keystonejs应用程序。使用 app2.example.com/pa 调用应用程序

我面临的问题是渲染覆盖不允许我使用子路径,并且我不想使用转发规则。我是否需要使我的关键失真应用程序可通过根 url(即 app2.example.com/(访问?还是有其他方法可以做到这一点?否则,我是否需要使用反向代理?比如nginx? 谢谢

注意:由于您是企业客户,我强烈建议您联系 Cloudflare 的客户成功经理和/或解决方案工程师。他们在那里帮助解决这类问题。也就是说,为了自助服务客户的利益,我将在这里回答这个问题。

我认为当您说"渲染覆盖"时,您实际上是指"解决覆盖"。此设置更改请求的 DNS 查找,以便将其路由到与正常情况不同的源 IP 地址。

请注意,"解决覆盖">不会以任何方式重写请求;它只会将其路由到其他服务器。因此,对www.example.com/app2/foo的请求将转到服务器app2.example.com,但路径仍将/app2/foo(而不是/foo(,并且Host标头仍将Host: www.example.com

听起来在您的情况下,除了重定向到不同的来源之外,您真的希望将/app2/*重写为/pa/*。您可以使用Cloudflare Workers来实现此目的,它允许您在Cloudflare的边缘执行任意JavaScript。脚本可能如下所示:

addEventListener("fetch", event => {
event.respondWith(handle(event.request));
});
async function handle(request) {
let url = new URL(request.url)  // parse the URL
if (url.pathname.startsWith("/app2/")) {
// Override the target hostname.
url.host = "app2.example.com"
// Replace /app2/ with /pb/ in the path.
url.pathname = "/pb/" + url.pathname.slice("/app2/".length)
// Send the request on to origin.
return fetch(url, request)
} else {
// Just override the hostname.
url.host = "app1.example.com"
// Send the request on to origin.
return fetch(url, request)
}
}

部署此规则后,您可以删除"解决替代"页面规则,因为它们现在由辅助角色脚本覆盖。

请注意,除了路径之外,上面的脚本实际上还重写了Host标头。如果您希望Host标头保持为www.example.com,则需要使用cf.resolveOverride选项。这仅适用于企业客户;如果您需要有关使用帮助,请咨询您的 CSM 或 SE。但是,在大多数情况下,您实际上希望重写Host标头,因此您可能不需要它。

最新更新