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

标签 spring apache tomcat proxy http-headers

我有一个外部服务:

https://domainx.com/path/a/to/my/app

通过代理和 web 服务,它最终出现在我的 tomcat 服务器上的 Spring(Data Rest)应用程序中,暴露在:

http://mytomcatserver:8080/this/is/my/app

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

{
    "id": "a_resource_001",
    "_links": {
        "self": {
            "href": "http://mytomcatserver:8080/this/is/my/app/res/a_resource_001"
        }
    }
}

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

这已经解决了:在消费端,在某处添加了一个 header :

X-Forwarded-Host=domainx.com

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

{
    "id": "a_resource_001",
    "_links": {
        "self": {
            "href": "https://domainx.com/this/is/my/app/res/a_resource_001"
        }
    }
}

链接已改进,但路径/context-root 仍然不匹配:

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

所以,我想,是否有 X-Forwarded-Path 或类似的东西。我的应用程序框架(Tomcat、Spring 或 Spring Data Rest)获取的一些 header ,用于在 JSON 响应中构建 url。 但是没有,没有找到。

有人知道如何解决这些问题吗?在我看来,我不是第一个处理这些东西的人。

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

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

最佳答案

我对此有同样的问题。

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

还有一个选项可以获取 x-forwarded-for 信息。那些必须从代理发送。

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

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

关于spring - 在代理中转发主机名和路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49534765/

相关文章:

java - 如何使用 Spring Hibernate 配置包级别 @TypeDefs

xml - spring servlet xml 顶部的声明是什么意思?

php - 友好的 URL 和 htaccess 级别

apache - 从 SSL 中排除特定目录

java - 无法在 Intellij Idea 中运行简单的 JSF 项目

java - 什么决定了Tomcat Java进程的当前工作目录?

spring - 如何 : Spring get rid of @Validate for automatic Controller validation?

java - 有没有办法手动调用 spring 绑定(bind)?

apache - mod_rewrite 删除一个 GET 变量

java - 通过与 IIS 8.5 连接的 TomCat 管理器部署时出现 404 错误