В функции Azure с прокси-сервером получите исходный URL-адрес

Я настраиваю приложение-функцию 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-адрес, полученный моим приложением-функцией?


person Aleks G    schedule 05.12.2018    source источник
comment
Я полагаю, что настройка заголовков X-Forwarded- * может помочь, но я действительно не пробовал это в Azure developer.mozilla.org/en-US/docs/Web/HTTP/Headers/   -  person Carlos Alves Jorge    schedule 05.12.2018
comment
@CarlosAlvesJorge Но что мне установить?   -  person Aleks G    schedule 05.12.2018
comment
Можете ли вы проверить, может ли эта статья быть полезной: github.com/watson/original-url   -  person Carlos Alves Jorge    schedule 05.12.2018
comment
@CarlosAlvesJorge благодарит, но, к сожалению, нет, поскольку прокси-сервер Azure не устанавливает ни один из заголовков X-Forwarded -...   -  person Aleks G    schedule 05.12.2018
comment
Но, очевидно, в исходномUrl есть информация заголовка, как вы сказали \ n \ u000fx-forwarded-for \ u0012 \ texample.com. Разве вы не можете просто передать это в заголовке, а затем получить к нему доступ в своей функции?   -  person Carlos Alves Jorge    schedule 05.12.2018
comment
@CarlosAlvesJorge Я понятия не имею, откуда это. Мой исходный URL-адрес был http://example.com/abc - это то, что я хочу получить внутри функции.   -  person Aleks G    schedule 05.12.2018
comment
Здесь также обсуждалась проблема: github.com/Azure/azure-functions-host/ issues / 1500 Несмотря на это, вы можете попытаться определить свой собственный заголовок клиента (как предложено выше) и взять значение из {request.headers.host} (или ввести дополнительный параметр запроса, который вы используете в своей функции)   -  person Sebastian Achatz    schedule 05.12.2018


Ответы (1)


Оказывается, первоначальное намерение 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 vs https), но в моем случае это не имеет значения, потому что я все равно использую https везде.

person Aleks G    schedule 06.12.2018
comment
Привет, я думаю, вы забыли вставить содержимое вашего proxies.json файла ... Я ищу такое же решение. - person Tur1ng; 11.06.2020