在代理中转发主机名和路径

cod*_*ith 5 apache proxy spring tomcat http-headers

我有一个外部服务:

https://domainx.com/path/a/to/my/app
Run Code Online (Sandbox Code Playgroud)

通过代理和 Web 服务,它最终出现在 Tomcat 服务器上的 Spring(Data Rest)应用程序中,暴露在以下位置:

http://mytomcatserver:8080/this/is/my/app
Run Code Online (Sandbox Code Playgroud)

该应用程序返回一个 HAL-JSON 响应,其中包含一个_links部分,指向其自身和其他资源。例如:

{
    "id": "a_resource_001",
    "_links": {
        "self": {
            "href": "http://mytomcatserver:8080/this/is/my/app/res/a_resource_001"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在消费方面,这个链接当然没有任何意义。

这个问题已经解决:在消费端,在某处添加了一个标头:

X-Forwarded-Host=domainx.com
Run Code Online (Sandbox Code Playgroud)

然后结果变成了(自动感谢框架):

{
    "id": "a_resource_001",
    "_links": {
        "self": {
            "href": "https://domainx.com/this/is/my/app/res/a_resource_001"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

链接已改进,但路径/上下文根仍然不匹配:

/path/a/to/my/app!= /this/is/my/app

所以,我想,是否有 X 转发路径或类似的东西。我的应用程序框架(Tomcat、Spring 或 Spring Data Rest)拾取一些标头,并用于在 JSON 响应中构建 url。但没有,没有找到。

有人知道如何解决此类问题。在我看来,我不是第一个处理这种事情的人。

哦,是的,在这种情况下使用相同的路径不是一个选项。(当然,如果我将应用程序的上下文根公开为/path/to/my/app,它会起作用。在这种情况下不是一个选项)

我想 Tomcat/Spring 中有一个解决方案,其中某些标头可能会影响链接。但我也认为这可以在网络服务器(apache)或代理设置中解决。

Man*_*uel 0

我对此也有同样的问题。

当您使用 Spring 应用程序时,最简单的方法是将上下文路径设置为与代理相同。

还可以选择获取 x-forwarded-for 信息。这些必须从代理发送。

在应用程序方面,您可以使用(在本例中为 application.properties)

server.use-forward-headers=true server.servlet.context-path=/my/custom/context/path