【问题标题】:Forwarded Tomcat through Apache uses wrong Context path通过 Apache 转发的 Tomcat 使用了错误的上下文路径
【发布时间】:2016-03-25 06:05:29
【问题描述】:

好的,让我快速解释一下我的问题。我在我的 tomcat 服务器上运行了一个 JEE 程序。服务器在 tomcat-users.xml 中定义了一些用户当我在本地机器上测试我的程序时,一切正常。

但是,如果我在服务器上部署 .war 并且我想访问 Rest Endpoint,则会收到 401 未经授权的错误。如果我删除用户安全检查,我可以使用该程序正常工作。所以 URL 和服务器设置是正确的。

我认为问题与通过我的apache转发tomcat有关。

假设我有一个在http://myIp.de 上运行的 apache

然后我使用以下 apache 配置转发 tomcat:

    ProxyRequests off
    ProxyPass /tomcat http://localhost:8181/ nocanon
    ProxyPassReverse /tomcat http://localhost:8181/

所以现在我可以通过以下方式访问 tomcat:http://myIp.de/tomcat 我也可以通过以下方式对我的应用“说话”:tomcat/myApp

但不知何故,身份验证现在失败了。我认为问题是 某种程度上与错误的上下文路径有关。因为tomcat/manager 也无法登录。

【问题讨论】:

    标签: apache tomcat jakarta-ee


    【解决方案1】:

    通过在 tomcat 上的/tomcat 下部署您的应用程序,让您的生活更轻松。这样就不需要路径转换。请记住,您将获得绑定到特定路径的所有会话 cookie,并且该路径在转发到客户端后不一定会被转换。

    另外,你迟早会需要

    ProxyPreserveHost On 
    

    (查找)或利用mod_jk 自动保留此标头(和更多信息)。

    编辑:根据您的评论,Basic Auth 标头似乎也没有转发到 tomcat。我自己没有尝试过,但我查找的所有地方似乎都暗示会有一些重复(例如 Apache 的第二个凭据文件) - 这看起来不太好。在这种情况下,我建议尝试使用 mod_jk 而不是 mod_proxy。您将使用JkMount 指令,而不是ProxyPass 并需要workers.properties,但是mod_jk 在转发到tomcat 时保留请求的完整上下文要好得多。到目前为止,我在这方面有很好的经验,并且只听到过很少的抱怨——主要是在非常庞大和复杂/复杂的情况下。如果它解决了你的问题,至少你应该尝试一下。

    【讨论】:

    • 好的,这看起来是解决我的问题的简单方法。但我不完全确定你建议我做什么。我目前在 /opt/tomcat/webapps/myApp 中部署“myApp”。我通过 myIp/tomcat/myApp/ 访问它。现在你建议我把 myApp 放在 /opt/tomcat/webapps/tomcat/myApp 或 /opt/tomcat/myApp 中?我不确定这对我有什么帮助?谢谢。
    • 在问题中,您将上下文命名为 /tomcat,在评论 /myapp 中。无论你给它起什么名字,请确保它在 apache 和木材上的名称相同。例如,假设没有防火墙并且都安装在同一台服务器上,hostname/myapphostname:8080/myapp 应该是相同的 asp
    • 好的,现在我明白了。所以链接现在很好,但是在尝试访问其余端点时我仍然收到 401 未经授权的错误。我很确定 web.xml 和 tomcat-users.xml 中的配置很好,因为当我在没有 apache 转发的情况下在本地测试它时它可以工作。此外,当我禁用 web.xml 中的安全约束时,它也可以正常工作。它就像 HttpBasicAuthFilter 在通往 tomcat 的途中迷路了。然后tomcat拒绝了这个请求。你知道这是为什么吗?非常感谢奥拉夫!
    猜你喜欢
    • 1970-01-01
    • 2011-02-06
    • 2015-08-03
    • 2017-07-27
    • 2011-01-02
    • 2010-10-14
    • 2016-04-03
    • 2011-02-01
    • 1970-01-01
    相关资源
    最近更新 更多