yarp переписывает жестко закодированные URL-адреса сервисов
Не знаю, правильно ли сформулирован мой вопрос, но я попробую... Я использую yarp в качестве обратного прокси. За прокси-сервером находится основная служба asp.net (служба заказа) на порту 5048, например
Итак, конфиг выглядит следующим образом:
"ReverseProxy": {
"Routes": {
"orderService": {
"ClusterId": "orderServiceProps",
"Match": {
"Path": "/order-service/{**Remainder}"
},
"Transforms": [
{
"PathRemovePrefix": "/order-service"
}
]
}
},
"Clusters": {
"orderServiceProps": {
"Destinations": {
"destination1": {
"Address": "http://localhost:5048"
}
}
}
}
}
Если я наберу, например, http://localhost:8080/order-service/api/collection, запрос перенаправится на http://localhost:5048/api/collection Пока все хорошо. Но служба заказов также имеет простой html-интерфейс, который показывает несколько простых ссылок на некоторые специальные конечные точки.
Теперь, если я нажму, например, на ссылку настроек , служба перейдет на http://localhost:5048/settings, но я хочу, чтобы служба перешла на http://localhost:8080/order-service/settings.
Я не знаю, могу ли я может достичь такого поведения.
Я не хочу, чтобы пользователь видел 5048 в своем браузере!
И могу ли я сделать это, не сообщая сервису, что он находится за прокси?
2 ответа
В сервисе заказов вы должны настроить промежуточное ПО X-Forwarded следующим образом:
// in ConfigureServices
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
});
// in Configure
app.UseForwardedHeaders();
Проверьте это для получения дополнительной информации:Настройка ASP.NET Core для работы с прокси-серверами и балансировщиками нагрузки
Проблема в том, что ваша служба создает ссылки в HTML, предполагая, что она работает на локальном хосте:5048, тогда как с точки зрения браузера она находится на другом URL-адресе.
Я не знаю, как заставить это работать без каких-либо изменений в вашем сервисе, но это возможно с минимальными изменениями.
Во-первых, сделайте все ссылки относительными, например, вместо<a href="http://localhost:5048/settings"
Тогда ваша ссылка, когда пользователь нажмет на нее, приведет кhttp://localhost:8080/settings
, что еще не то, что вам нужно, но, по крайней мере, адрес хоста:порт правильный.
Во-вторых, когда вы визуализируете HTML-страницу (или обслуживаете ее из статического файла), добавьте тег в заголовок HTML, например:
<head>
...
<base href="http://localhost:8080/order-service/">
...
</head>
В результате ваш базовый адрес будет автоматически добавлен ко всем относительным ссылкам на вашей странице, поэтому<a href="settings">
приведет кhttp://localhost:8080/order-service/settings
, так же, как вы этого хотите.
Как видите, ваш сервис по-прежнему должен знать адрес, по которому осуществляется доступ, но он локализован в одном месте — вbase
ярлык.