我目前有两个在Cloudflare中使用以下CNAME设置的Web应用程序。两者都是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? 谢谢
答案 0 :(得分:1)
注意:由于您是企业客户,因此我强烈建议您与Cloudflare的客户成功经理和/或解决方案工程师联系。他们在那里可以帮助您解决这类问题。就是说,我在这里回答这个问题是为了自助客户。
我认为当您说“ Render Override”时,实际上是指“ Resolve Override”。此设置将更改请求的DNS查找,以便将其路由到与通常不同的原始IP地址。
请注意,Resolve Override不会以任何方式重写请求;它只会将其路由到其他服务器。因此,对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
,则需要使用the cf.resolveOverride
option。这仅适用于企业客户;询问您的CSM或SE是否需要帮助。但是,在大多数情况下,您实际上希望重写Host
标头,因此您可能不需要此标头。