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

时间:2009-04-17 12:50:45

标签: apache redirect proxypass

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

ProxyPreserveHost on
ProxyPass /r http://localhost:18080/redirectService/
ProxyPassReverse /r http://localhost:18080/redirectService/

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

中的jboss servlet请求中获取它

5 个答案:

答案 0 :(得分:27)

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

答案 1 :(得分:27)

JasonW的答案很好。但是,自apache httpd 2.4.6以来,还有另一种选择:mod_remoteip

你必须做的就是:

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

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

    RemoteIPHeader X-Forwarded-For
    
  4. 请参阅http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html了解更多信息和更多选项。

答案 2 :(得分:12)

这有一个更优雅的解释和多个可能的解决方案。 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

答案 3 :(得分:9)

如果您有能力这样做,我建议使用mod-jkmod-proxy-ajp将请求从Apache传递到JBoss。与使用HTTP代理请求相比,AJP协议效率更高,并且作为一项好处,JBoss会将请求视为来自原始客户端而非Apache。

答案 4 :(得分:1)

如果您使用Apache反向代理服务于在localhost端口上运行的应用程序,则必须向vhost添加位置。

<Location />            
   ProxyPass http://localhost:1339/ retry=0
   ProxyPassReverse http://localhost:1339/
   ProxyPreserveHost On
   ProxyErrorOverride Off
</Location>

要获取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 

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