在HTTPD上检索客户端源端口 - > Tomcat设置

时间:2012-03-21 20:02:58

标签: tomcat apache

我有一个配置为处理HTTPS连接的httpd服务器,并将连接转发到处理请求的Tomcat(通过http或ajp)。我在Tomcat服务器中的一个要求是记录每个请求的远程端口号。如果我直接点击Tomcat,检索远程端口号是直截了当的,我们目前正在使用getRemotePort()函数(HttpServletRequest)进行检索。

但是,由于我正在进行反向代理(通过HTTP / AJP转发HTTPS请求),因此将创建一个新连接,我将始终从我的连接获取远程端口(以及远程IP)。 httpd服务器到tomcat(除非我使用AJP。在这种情况下远程服务器IP信息正确)。

我在httpd上尝试了不同的配置,例如:

ProxyPreserveHost On
ProxyPass / ajp://localhost:8009/

ProxyPreserveHost On
ProxyPass / http://localhost:8081/

我还使用RewriteRules玩了一下,但是无法让事情发挥作用。

阅读httpd文档,mod_proxy为X-Forwarded-HostX-Forwarded-For等提供请求标头信息。但是没有关于源端口的信息。

even found a bug,显然在代理请求标头中添加了X-Forwarded-Port属性,但该代码似乎没有对主线/分支进行。

因此,总之,当HTTPD将请求转发给Tomcat时,如何检索客户端的源端口(而不是反向代理)?

2 个答案:

答案 0 :(得分:3)

您可以使用mod_rewrite + mod_headers

添加名为 X-Forwarded-SourcePort 的请求标头
RewriteEngine on
RewriteRule .* - [E=REMOTE_PORT:%{REMOTE_PORT},NE]
RequestHeader set X-Forwarded-SourcePort %{REMOTE_PORT}e

Apache会将带有客户端源端口的请求转发到后端服务器,这样您就可以从应用程序中获取X-Forwarded-SourcePort请求头。

答案 1 :(得分:0)

我相信你可以使用mod_rewrite模块

来做到这一点

RewriteRule中,您可以在 Substitution 字符串中指定服务器变量,如文档中所述

In addition to plain text, the Substition string can include

    back-references ($N) to the RewriteRule pattern
    back-references (%N) to the last matched RewriteCond pattern
    server-variables as in rule condition test-strings (%{VARNAME})

其中一个变量是REMOTE_PORT。 然后,您可以重写URL并将其作为URL参数传递给Tomcat servlet调用,例如

http://url.to.tomcat/mycontext?remoteport=${REMOTE_PORT}