ProxyPass,ProxyReverse与AJP

use*_*196 15 apache tomcat ajp proxypass

我目前有一个Tomcat + Apache HTTP服务器设置来为我的Java servlet提供服务:

ProxyPass /myservice http://localhost:8080/myservice
ProxyPassRerverse /myservice http://localhost:8080/myservice
Run Code Online (Sandbox Code Playgroud)

这一切都很好,除了myservice需要知道客户端IP地址,由于代理服务器总是证明是127.0.0.1.有没有解决方案来获得真正的IP地址?AJP是一个选择吗?

doGet(HttpServletRequest request, HttpServletResponse response){
    request.getRemoteAddr()
}
Run Code Online (Sandbox Code Playgroud)

cas*_*key 21

像这样做:

在apache配置中:

<Location /foo>
  ProxyPass ajp://localhost:8009/foo
  ProxyPassReverse ajp://localhost:8009/foo
</Location>
Run Code Online (Sandbox Code Playgroud)

然后在您的server.xml中:

<Connector port="8009" 
           enableLookups="false" secure="true" URIEncoding="UTF-8"
           tomcatAuthentication="false"
           protocol="AJP/1.3" />
Run Code Online (Sandbox Code Playgroud)

这应该通过一切.AJP协议传递信息,但http:不传递.

您可能不希望secure ="true",我使用它,因为SSL在apache层处理,我需要tomcat知道连接应该被认为是安全连接.

  • 请考虑修改您的ProxyPassReverse设置,因为这似乎是一个常见的错误,根据http://www.humboldt.co.uk/2009/02/the-mystery-of-proxypassreverse.html (6认同)
  • @Jack:您的链接文章很有用,但地址已损坏.http://www.humboldt.co.uk/the-mystery-of-proxypassreverse/似乎有效. (3认同)

roc*_*ist 5

您可以在请求标头中读取X-Forwarded-For.

Apache mod_proxy文档:

当以反向代理模式运行时(例如,使用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")
}
Run Code Online (Sandbox Code Playgroud)