【问题标题】:servlets behind a proxy: getting un-proxied URL代理后面的 servlet:获取未代理的 URL
【发布时间】:2011-11-14 10:23:03
【问题描述】:

Servlet 规范、Tomcat 或 Wicket 中是否有任何内容允许在 mod_proxy 后面运行的 web 应用确定请求的非代理 URL

我们需要发送带有链接的电子邮件。我一直在使用以下 Wicket 来构建应用程序中特定页面的 URL:

String relURL = RequestCycle.get().getRequest().getRelativePathPrefixToWicketHandler();
RequestUtils.toAbsolutePath(relURL);

由于电子邮件不会通过代理返回,因此 URL 当然不会被重写,最终看起来像 http://localhost/...

目前我能做的最好的事情就是将 URL 硬编码到我们的生产服务器,但这会让我们在开发/测试机器上运行时遇到一些调试难题。

使用InetAddress.getLocalHost().getHostName() 并不是真正的解决方案,因为它可能会返回prod1.mydomain.com 或类似的东西,而不是mydomain.dom,请求可能源自该mydomain.dom

【问题讨论】:

    标签: java servlets wicket mod-proxy


    【解决方案1】:

    回答问题Retain original request URL on mod_proxy redirect

    如果您运行的是 Apache >= 2.0.31,那么您可以尝试设置 ProxyPreserveHost 指令,如 here 所述。

    这应该将原始主机标头通过 mod_proxy 传递到您的 应用程序,通常请求 URL 将在那里重建(在 您的 Servlet 容器)使用 Host 标头,因此架构位置 应该使用代理“之前”的主机和路径信息构建。

    【讨论】:

      【解决方案2】:

      Servlet 规范、Tomcat 或 Wicket 中是否有任何内容允许在 mod_proxy 后面运行的 webapp 确定请求的非代理 URL?

      没有。如果反向代理在传递消息头之前没有将您需要的信息放入消息头中,则无法恢复。

      您需要查看 Apache Httpd 文档,以了解如何让前端在通过的过程中将您需要的信息放入 HTTP 请求标头中。 (可以做到,具体的我记不得了。)

      【讨论】:

      • 仅供参考:mod_proxy 中也提供了有关如何配置 mod_proxy 的说明。
      猜你喜欢
      • 2012-05-05
      • 2015-10-16
      • 1970-01-01
      • 2019-08-14
      • 2016-07-09
      • 2010-11-23
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多