在带代理的 Azure 函数中,获取原始 URL

In Azure function with proxy, get original 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 函数中,我尝试使用 req.originalUrl 访问原始请求的 URL - 但它始终设置为 http://example.com/api/myfunc

我尝试添加请求覆盖以添加额外的 header,如下所示:

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

然而,这不起作用并且 X-Original-Url header 包含 \n\u000fx-forwarded-for\u0012\texample.com

我怎样才能可靠地获得我的函数应用收到的原始 URL?

原来,originalUrl的初衷就是这样,保留用户调用的原始URL。如果我们真正处理一个没有任何 MS 代理的 node.js 应用程序,但可以重写,它就是这样工作的。

所以在我的情况下,我不得不使用 requestOverrides 和自定义 headers 来满足我的需求。我的 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。

查看此 GitHub 问题:https://github.com/Azure/azure-functions-host/issues/1500

我们可以通过 requestOverrides:

将原始“主机”header 传递到我们的后端
{
    "$schema": "http://json.schemastore.org/proxies",
    "proxies": {
        "chandler-function-proxy-app1": {
            "matchCondition": {
                "route": "/{*proxyPath}"
            },
            "backendUri": "https://localhost/entry",
            "requestOverrides": {
                "backend.request.headers.X-ORIGINAL-HOST": "{request.headers.host}"
            }
        }
    }
}

注意我们把原来的pathname也用/{*proxyPath}抓取了,所以可以得到

  • 原创 pathname context.req.params.proxyPath
  • 原创 Host context.req.headers["x-original-host"]