我目前有一个Tomcat + Apache HTTP服务器设置来为我的Java servlet提供服务:
ProxyPass /myservice http://localhost:8080/myservice
ProxyPassRerverse /myservice http://localhost:8080/myservice
除了myservice
需要知道客户端IP地址(由于代理服务器总是证明是127.0.0.1)之外,这一切都很好。有没有解决方案来获得真正的IP地址? AJP是一种选择吗?
doGet(HttpServletRequest request, HttpServletResponse response){
request.getRemoteAddr()
}
答案 0 :(得分:21)
这样做:
在apache config中:
<Location /foo>
ProxyPass ajp://localhost:8009/foo
ProxyPassReverse ajp://localhost:8009/foo
</Location>
然后在你的server.xml中:
<Connector port="8009"
enableLookups="false" secure="true" URIEncoding="UTF-8"
tomcatAuthentication="false"
protocol="AJP/1.3" />
那应该通过一切。 AJP协议传递信息,但http:没有。
您可能不希望secure =“true”,我使用它,因为SSL是在apache层处理的,我需要tomcat知道连接应该被认为是安全的。
答案 1 :(得分:5)
您可以在请求标题中阅读X-Forwarded-For。
来自Apache mod_proxy documentation:
当以反向代理模式运行时(例如,使用ProxyPass指令),mod_proxy_http会添加多个请求标头,以便将信息传递给源服务器。这些标题是:
- X-Forwarded-For :客户端的IP地址。
- X-Forwarded-Host :客户端在Host HTTP请求标头中请求的原始主机。
- X-Forwarded-Server :代理服务器的主机名。
在原始服务器上使用这些标头时要小心,因为如果原始请求已包含其中一个标头,它们将包含多个(逗号分隔)值。例如,您可以在源服务器的日志格式字符串中使用%{X-Forwarded-For} i来记录原始客户端的IP地址,但如果请求通过多个代理,您可能会获得多个地址。
在您的servlet中,您将拥有:
doGet(HttpServletRequest request, HttpServletResponse response){
request.getHeader("X-Forwarded-For")
}
答案 2 :(得分:1)
这很简单:
<VirtualHost>
ServerName www.server.com
redirect / http://www.server.com/foo
ProxyRequests off
ProxyPass / ajp://localhost:8009/
</VirtualHost>