Как преобразовать заголовок запроса, чтобы я не столкнулся с ошибкой 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());
Другие вопросы по тегам