我有一个配置为处理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-Host
,X-Forwarded-For
等提供请求标头信息。但是没有关于源端口的信息。
我even found a bug,显然在代理请求标头中添加了X-Forwarded-Port
属性,但该代码似乎没有对主线/分支进行。
因此,总之,当HTTPD将请求转发给Tomcat时,如何检索客户端的源端口(而不是反向代理)?
答案 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}