Начал с Kibana. Я использую C# только для того, чтобы впоследствии динамически добавлять несколько серверов Kibana.
У меня есть этот маршрут:
Код: Выделить всё
private static IReadOnlyList GetRoutes()
{
return new[]
{
new RouteConfig
{
RouteId = "kibanaRoute",
ClusterId = "kibanaCluster",
Match = new RouteMatch
{
Path = "/kibana/{**catch-all}" // Match all paths under /kibana
},
}
};
}
private static IReadOnlyList GetClusters()
{
return new[]
{
new ClusterConfig
{
ClusterId = "kibanaCluster",
Destinations = new Dictionary
{
{
"destination1", new DestinationConfig
{
Address = "https://mykibana.com/" // Address of the internal Kibana service
}
}
}
}
};
}
Навигация to /kibana правильно примет мой запрос на https://mykibana.com. Однако кибана выполняет 302 для /login?next=%2Fkibana
Я добавил следующее преобразование (жестко запрограммированное для моего примера /kibana):
Код: Выделить всё
builder.Services.AddReverseProxy().LoadFromMemory(GetRoutes(), GetClusters())
.AddTransforms(builderContext =>
{
builderContext.AddPathRemovePrefix("/kibana/"); // Remove /kibana before forwarding
builderContext.AddResponseTransform(async (transformContext) =>
{
if (transformContext.ProxyResponse.StatusCode == System.Net.HttpStatusCode.MovedPermanently || transformContext.ProxyResponse.StatusCode == System.Net.HttpStatusCode.Redirect)
{
if (transformContext?.ProxyResponse?.Headers.Location != null)
{
try
{
var originalLocation = transformContext.ProxyResponse.Headers.Location;
if (Uri.TryCreate($"/kibana{originalLocation}", UriKind.Relative, out var locationUri))
{
transformContext.ProxyResponse.Headers.Location = locationUri;
}
}
catch (Exception ex)
{
throw;
}
}
}
await Task.CompletedTask;
});
});
Да у кого-нибудь есть лучшее решение, чем преобразование ответов? Или знаете, почему они не работают?
Подробнее здесь: https://stackoverflow.com/questions/789 ... -redirects