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ярлык.

Другие вопросы по тегам