apache ProxyPass:如何保留原始IP地址

ash*_*eta 39 apache redirect proxypass

我们使用ProxyPass将所有"/ r"请求重定向到端口18080上的jboss,如下所示:

ProxyPreserveHost on
ProxyPass /r http://localhost:18080/redirectService/
ProxyPassReverse /r http://localhost:18080/redirectService/
Run Code Online (Sandbox Code Playgroud)

但是,这会导致jboss访问日志中记录的IP地址为"127.0.0.1".有人知道我们如何保留HttpServletRequest中请求所在的原始IP?我们希望在doGet()中从jboss servlet请求中获取它

and*_*dri 29

您可以从X-Forwarded-For标头字段中获取原始主机.


Ste*_*fen 28

JasonW的答案很好.但是自apache httpd 2.4.6以来就有了另一种选择:mod_remoteip

你必须做的就是:

  1. 可能是你必须安装mod_remoteip包
  2. 启用模块:

    LoadModule remoteip_module modules/mod_remoteip.so
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将以下内容添加到您的apache httpd配置中.请注意,您必须添加此行为代理服务器的配置.您必须将其添加到代理目标httpd服务器(代理服务器后面的服务器)的配置中:

    RemoteIPHeader X-Forwarded-For
    
    Run Code Online (Sandbox Code Playgroud)

有关更多信息和更多选项,请参阅http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html.

  • 你在这里描述的设置是什么?它是另一个 apache 背后的 apache 吗?这适用于 apache 背后的 jboss 吗? (2认同)

小智 13

这有一个更优雅的解释和不止一个可能的解决方案.http://kasunh.wordpress.com/2011/10/11/preserving-remote-iphost-while-proxying/

该文章描述了如何在涉及代理的设置中使用一个流行的和一个鲜为人知的Apache模块来保留主机/ ip.

使用mod_rpaf模块,在后端服务器中安装并启用它,并在模块的配置中添加以下指令.RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1

(2017年编辑)mod_rpaf的当前位置:https://github.com/gnif/mod_rpaf

  • 如果您实际总结了链接的内容和/或引用最相关的部分,那就更好了.否则它只是看起来像你在发送垃圾邮件. (4认同)

Jas*_*her 9

如果你有能力这样做,我建议使用mod-jkmod-proxy-ajp将请求从Apache传递给JBoss.与使用HTTP代理请求相比,AJP协议更有效,并且作为一个好处,JBoss将看到请求来自原始客户端而不是Apache.


Tar*_*pta 7

如果您使用 Apache 反向代理为在本地主机端口上运行的应用程序提供服务,您必须向您的虚拟主机添加一个位置。

<Location />            
   ProxyPass http://localhost:1339/ retry=0
   ProxyPassReverse http://localhost:1339/
   ProxyPreserveHost On
   ProxyErrorOverride Off
</Location>
Run Code Online (Sandbox Code Playgroud)

要获取 IP 地址有以下选项

console.log(">>>", req.ip);// this works fine for me returned a valid ip address 
console.log(">>>", req.headers['x-forwarded-for'] );// returned a valid IP address 
console.log(">>>", req.headers['X-Real-IP'] ); // did not work returned undefined 
console.log(">>>", req.connection.remoteAddress );// returned the loopback IP address 
Run Code Online (Sandbox Code Playgroud)

所以要么使用 req.ip 要么 req.headers['x-forwarded-for']