Как преобразовать заголовок запроса, чтобы я не столкнулся с ошибкой CORS?
В настоящее время у меня есть сайт, который принимает все входящие запросы и перенаправляет их на правильный сайт.
В настоящее время это настроено с помощью этой конфигурации Yarp:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"server": {
"ClusterId": "old-site",
"Match": {
"Path": "{**catch-all}"
}
},
"azure": {
"ClusterId": "new-site",
"Match": {
"Path": "yarpb"
}
}
},
"Clusters": {
"old-site": {
"Destinations": {
"server": {
"Address": "https://test-www.a.com/"
}
}
},
"new-site": {
"Destinations": {
"yarpb": {
"Address": "https://example.com/"
}
}
}
}
}
}
Точка входа — test.a.com, и в соответствии с приведенным выше правилом перенаправления будет перенаправлено на test-www.a.com.
Это нормально, и работает так, как предполагается.
Один из сайтов, который сейчас кажется проблематичным, — это CMS Backoffice umbraco, test.a.com/umbraco, который иногда извлекает файлы из папки app_plugins.
Некоторые из этих файлов извлекаются с помощью CORS.
что вызывает проблему, когда исходный html-запрос перенаправляется на другую страницу.
Можно ли как-то пропустить его?
Я в коде пробовал этоapp.UseCors(x => x.AllowAnyOrigin());
но вроде ничего не меняется?
это похоже на то, что это устанавливается после того, как yarp перенаправит запрос, поскольку состояние регистрации yarp200
ответ, но браузер говорит405
?
Фрагмент журнала:
2022-06-21T17:48:02.6237461+02:00 INFO [Yarp.ReverseProxy.Forwarder.HttpForwarder] [Forwarding] Proxying to https://test-www.a.com/App_Plugins/RJP.MultiUrlPicker/MultiUrlPicker.html HTTP/2 RequestVersionOrLower no-streaming
2022-06-21T17:48:02.6255128+02:00 INFO [Yarp.ReverseProxy.Forwarder.HttpForwarder] [ResponseReceived] Received HTTP/2.0 response 301.
2022-06-21T17:48:02.6256100+02:00 INFO [ReverseProxy.Middleware.RequestResponseLoggerMiddleware] [LogRequest] https://test.a.com/App_Plugins/RJP.MultiUrlPicker/MultiUrlPicker.html proxied to https://test-www.a.com//App_Plugins/RJP.MultiUrlPicker/MultiUrlPicker.html
2022-06-21T17:48:02.6273081+02:00 INFO [Yarp.ReverseProxy.Forwarder.HttpForwarder] [ResponseReceived] Received HTTP/2.0 response 200.
вся программа.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddReverseProxy().LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
builder.Services.AddLogging(x =>
{
x.AddJsonConsole();
x.AddFile($"logs/app-{DateTime.UtcNow:yyyyMMddHHmmss}.log", append: true);
});
var app = builder.Build();
app.UseStaticFiles();
app.UseRouting();
app.UseCors(x => x.AllowAnyOrigin());
app.MapReverseProxy(proxyPipeline =>
{
proxyPipeline.UseRequestResponseLogging();
});
app.Run();
2 ответа
Итак, после некоторого расследования мне, наконец, удалось решить проблему с помощью yarp, изменив местоположение заголовка ответа, чтобы оно совпадало с заголовком запроса.
.AddTransforms(builderContext =>
{
builderContext.AddResponseTransform(async context => {
if (context.HttpContext.Response.StatusCode == 302 || context.HttpContext.Response.StatusCode == 301)
{
if (context.ProxyResponse == null)
{
return;
}
var proxyResponse = context.ProxyResponse.Headers;
var oldLocation = context.HttpContext.Response.GetTypedHeaders().Location;
if (oldLocation == null)
{
return;
}
var oldLocationScheme = oldLocation.Scheme;
var oldLocationHost = oldLocation.Host;
var oldLocationsPath = oldLocation.AbsolutePath;
var newLocation = new UriBuilder()
{
Scheme = oldLocationScheme,
Host = oldLocationHost,
Path = oldLocationsPath
}.Uri;
context.HttpContext.Response.GetTypedHeaders().Location = proxyResponse.Location = newLocation;
context.SuppressResponseBody = true;
}
});
Добавьте следующее в Configure
app.UseCors(options => options.SetIsOriginAllowed(x => _ = true).AllowAnyMethod().AllowAnyHeader().AllowCredentials());