Azure Functions Proxy作为路由器时嵌套查询参数被截断如何解决
问题原因
参数截断的核心原因是嵌套URL中的?、=等特殊字符未做URL编码,Azure Functions Proxy解析查询字符串时,会将这些特殊字符识别为当前请求的参数分隔符,而非fromURI参数内容的一部分,同名的post_logout_redirect_uri也会因此被识别为当前请求的独立参数,不会被归入fromURI的值中。
解决方案
对嵌套的URL参数做逐层URL编码,即可保证参数完整传递,具体操作如下:
- 从最内层的跳转地址开始,逐层将URL参数值做URL编码后再拼入上一层的参数中,避免每一层解析时拆分属于下层的查询参数
- 静态配置场景直接将最终编码后的完整值写入代理配置即可,动态传参场景可以使用代理内置的编码函数自动处理
静态配置示例
编码完成后的代理配置如下:
"proxyLogout": { "matchCondition": { "route": "/site/redirect" }, "backendUri": "http://www.myWebsite.com/signout", "requestOverrides": { "backend.request.querystring.fromURI": "http%3A%2F%2Fwww.anotherwebsite.com%3Fpost_logout_redirect_uri%3Dhttp%253A%252F%252Fwww.anotherwebsite.com%252Fsecondtask%253Fpost_logout_redirect_uri%253Dhttp%25253A%25252F%25252Ffinaldestination.com%25252FHome" } }
动态传参配置示例
如果fromURI是通过请求/site/redirect时传入的查询参数,可使用内置编码函数自动处理,无需手动编码:
"proxyLogout": { "matchCondition": { "route": "/site/redirect" }, "backendUri": "http://www.myWebsite.com/signout", "requestOverrides": { "backend.request.querystring.fromURI": "{encodeUriComponent(request.querystring.fromURI)}" } }
编码后的特殊字符会被转为%3F(对应?)、%3D(对应=)等编码格式,代理会将其识别为普通参数内容完整传递,后端服务拿到参数后逐层解码即可获取完整的嵌套跳转地址。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

