我正在用 Java 编写一个应用程序,该应用程序为网页提供来自底层数据库的数据。我根据一些 IP 限制限制对网页的访问。基本上,任何落入“已接受”范围内的 IP 都将被允许访问该网页,而该范围之外的任何 IP 都将被重定向到错误页面。要获取尝试访问该页面的用户的 IP 地址,我使用以下命令:
String userIPAddress = request.getRemoteAddr();
“请求”是我的 HttpServletRequest 对象。
我遇到的问题是此网页是通过 Apache Web 服务器代理的。
发生这种情况时,它会丢失客户端 IP 地址并采用我们防火墙的 IP 地址。因此,当我访问 request.getRemoteAddr() 时,无论客户尝试从何处访问网页,它都会返回相同的 IP。
当通过直接 IP 地址在内部访问网页时,我的 IP 检查工作正常。当您通过代理访问时,问题就出现了。
是否可以通过编程方式访问客户端的实际 IP 地址?或者这是必须通过 Apache Web 服务器完成/更改以允许此信息通过的事情吗?在那种情况下,如果那是一个更好的论坛,我可以发帖到 Server Fault。
非常感谢您的帮助。
最好的问候。
最佳答案
当以反向代理模式运行时(例如使用 ProxyPass 指令),Apache mod_proxy_http添加几个请求 header 以便将信息传递给源服务器,其中之一是 X-Forwarded-For
,它将包含客户端的 IP 地址。
请记住,如果原始请求已经包含此 header (这一点并不罕见),Apache 会将客户端 IP 地址附加到现有值,因此您将获得以逗号+空格分隔的 IP 地址列表.最后(最右边)的 IP 地址始终是连接到最后一个代理(您的 Apache)的 IP 地址,这意味着这是您要测试的代理。
关于java - Apache 代理隐藏了 HttpServletRequest 对象的远程 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40386578/