在带代理的 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"]
我正在设置一个 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
:
{
"$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"]