В функции Azure с прокси получите оригинальный URL - PullRequest
0 голосов
/ 05 декабря 2018

Я настраиваю приложение-функцию Azure, в котором я перенаправляю все запросы на поддомен одной конкретной функции.Мой proxies.json выглядит следующим образом:

{
  "$schema": "http://json.schemastore.org/proxies",
  "proxies": {
    "Root URI to Trigger Function": {
      "matchCondition": {
        "route": "/{*path}",
        "methods": [
          "GET",
          "POST"
        ]
      },
      "backendUri": "http://example.com/api/myfunc"
    }
  }
}

Внутри моей функции myfunc я пытаюсь получить доступ к URL-адресу исходного запроса, используя req.originalUrl - однако он всегда установлен на http://example.com/api/myfunc.

Я попытался добавить переопределение запроса, чтобы добавить дополнительный заголовок, что-то вроде этого:

"requestOverrides": {
  "backend.request.headers.X-Original-URL": "{request.originalUrl}"
}

Тем не менее, это не работает, и заголовок X-Original-Url содержит \n\u000fx-forwarded-for\u0012\texample.com значение

Как я могу надежно получить исходный URL, полученный моим функциональным приложением?

1 Ответ

0 голосов
/ 06 декабря 2018

Оказывается, первоначальное намерение originalUrl было именно таким, чтобы сохранить исходный URL-адрес, вызванный пользователем.Вот как это будет работать, если мы действительно работаем с приложением node.js без каких-либо прокси-серверов MS, но возможно с перезаписью.

Так что в моем случае мне пришлось использовать requestOverrides и пользовательские заголовки, чтобы получитьмне то, что мне нужно.У моего proxies.json теперь есть это:

И в моей функции я могу восстановить URL следующим образом:

let origHost = req.headers.hasOwnProperty('x-original-host') ? req.headers['x-original-host'] : req.headers['host'];
let origPath = req.headers.hasOwnProperty('x-original-path') ? req.headers['x-original-path'] : ''
let search = new URL(req.url).search;

let originalUrl = 'https://' + origHost + '/' + origPath + (search ? '?' : '') + search;

Кажется, что нет способа получить оригинальный протокол(http против https), но в моем случае это не имеет значения, потому что я все равно использую https везде.

...