REST API 在反向代理后面生成绝对 URL

REST API generating absolute URLs behind reverse proxy

情况

我有一个 REST API 到位 returns JSON objects 给它的客户。部分所述 JSON 响应是对其他“链接”resources/objects 形式“http://myservice.com/servicePath/apiVersionA/123”的绝对 URLs。在示例中 URL “servicePath” 是我服务的 Web 根目录,“apiVersionA” 是正在使用的 REST API 的特定版本,“123” 是实际资源的标识符。我的 API 在响应 body 中返回绝对资源 URLs 的事实是由我使用的协议规定的,我无权更改它。

问题 我现在面临的问题是反向代理,更具体地说,我假设它们如何处理如下请求模式:

  1. 客户端向反向代理发送请求“GET http://myproxy.com/rest/apiVersionA/123"
  2. 反向代理将请求转发到它的最终目的地:“GET http://myservice.com/servicePath/apiVersionA/123"。请注意,代理修改了主机名和 URL 路径(“rest”更改为“servicePath ") 的请求。

AFAIK,通常的嫌疑人(即 HTTP headers“转发”、“X-Forwarded-For”、“X-Forwarded-Host”等)仅包含 IP 地址或域名,但不是整个 URL 路径。所以现在在最好的情况下我可以生成像“http://myproxy.com/apiVersionA/123”这样的URL——注意缺少的“rest”URL路径元素代理人。因此,代理在客户端发出的后续请求中不会接受此 URLs,例如检索响应消息中引用的资源。

问题

  1. 是否有一个明显的 proxy-safe HTTP header 可以将原始请求 URL 传送到实际的 REST API 服务?
  2. 如果没有,是否有其他方法可以在我的服务中生成正确的绝对 URLs?

到目前为止,我已经考虑过使用自定义 HTTP header(可能会被中间代理删除),或者在反向代理上使用类似 https://httpd.apache.org/docs/2.4/mod/mod_substitute.html 的东西(我会说是不可能的,因为我不控制我的客户或任何中介的网络基础设施)。我想出的另一个“non-solution”是将其记录为我的 API 的一部分:“不要在 HTTP 代理上使用自定义 URL 路径元素”。这将允许我仅使用 X-Forwarded-Host 和 X-Forwarded-Proto.

生成 URLs

感谢任何帮助!

经过更多的研究,很明显确实没有标准的 HTTP header 可以完成这项工作。因此,我着手实施“Forwarded/X-Forwarded-For”和微软专有的“X-Forwarded-PathBase”(https://microsoft.github.io/reverse-proxy/articles/transforms.html) header 的组合。这按预期工作 - 不能或不想使用专有 header 的客户仍然可以通过反向代理取回有效的绝对 URL,只要他们不在其代理配置中实现请求路径映射。