Маршрутизация запросов с использованием cloudflare к различным веб-приложениям
В настоящее время у меня есть два веб-приложения, настроенные в cloudflare со следующими CNAME. Оба являются приложениями keystonejs.
app1.example.com ===pointing to ===> AWS ALB 1
app2.example.com ===pointing to ===> AWS ALB 2
Я настроил Cloudflare Enterprise, поэтому я могу использовать функцию "Render Override" в правилах моей страницы. У меня есть двухстраничные правила, настроенные с использованием следующего:
www.example.com ===render override ===> app1.example.com
www.example.com/app2/* ===render override ===> app2.example.com
Теперь для доступа к приложению keystonejs на app2.example.com. Приложение вызывается с помощью app2.example.com/pa
Проблема, с которой я сталкиваюсь, состоит в том, что переопределение рендера не позволяет мне использовать подпути, и я не хочу использовать правило пересылки. Нужно ли мне сделать мое приложение keystone доступным через корневой URL, а именно app2.example.com/? или есть другой способ сделать это? В противном случае, мне нужно будет использовать обратный прокси-сервер? такие как nginx? Спасибо
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, который позволяет выполнять произвольный JavaScript на краю Cloudflare. Вот как может выглядеть скрипт:
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)
}
}
После этого вы можете удалить правила страницы Resolve Override, так как они теперь включены в рабочий скрипт.
Обратите внимание, что приведенный выше скрипт на самом деле переписывает Host
заголовок в дополнение к пути. Если вы хотите Host
заголовок, чтобы остаться как www.example.com
, то вам нужно будет использовать cf.resolveOverride
вариант. Это доступно только для корпоративных клиентов; спросите вашего CSM или SE, если вам нужна помощь в его использовании. Но в большинстве случаев вы действительно хотите Host
заголовок должен быть переписан, так что вам, вероятно, это не нужно.