1

我正在设置一个 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- 但它始终设置为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?

4

2 回答 2

0

事实证明,最初的意图originalUrl正是如此,以保留用户调用的原始 URL。如果我们真的在没有任何 MS 代理的情况下处理 node.js 应用程序,这就是它的工作方式,但可以通过重写来实现。

所以在我的情况下,我不得不使用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。

于 2018-12-06T12:09:26.480 回答
0

请参阅此 GitHub 问题:https ://github.com/Azure/azure-functions-host/issues/1500

我们可以将原始的“主机”标头传递给我们的后端requestOverrides

{
    "$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"]
于 2021-09-01T16:55:09.327 回答