
获取服务器当前ip
Nginx配置优化:确保反向代理服务器正确配置,提供必要的IP头信息。 多级反向代理处理:如果用户通过多个代理访问,IP地址可能包含多个值,按逗号分割取第一个IP。 本地IP获取:如果前置代理无法获取真实IP,可以尝试获取本机IP。 异常处理:考虑异常情况,避免空指针或未知值出现。
发布日期:2021-05-08 14:12:46
浏览次数:21
分类:精选文章
本文共 1840 字,大约阅读时间需要 6 分钟。
nginx配置与IP获取逻辑优化
在实际应用中,获取用户的真实IP地址是一个常见的需求。以下是基于反向代理服务器(如nginx)配置的一些优化思路和实现方法。
一、反向代理配置
在nginx配置文件中,可以通过设置proxy_set_header
指令来自定义IP信息。例如:
proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
这些设置可以帮助前端或后端逻辑更方便地获取用户的原始IP地址。
二、IP获取逻辑优化
在实际应用中,可能会遇到多级反向代理的情况,因此需要多种方式获取用户的真实IP地址。以下是一种常见的逻辑实现:
@RequestMapping("/queryIP")@ResponseBodypublic String queryIP(HttpServletRequest request) { // 尝试从Nginx配置中获取IP String ipAddress = request.getHeader("X-Real-IP"); if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("X-Forwarded-For"); } if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("Proxy-Client-IP"); } if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getRemoteAddr(); if (ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")) { // 获取本机IP InetAddress inet = null; try { inet = InetAddress.getLocalHost(); } catch (UnknownHostException e) { e.printStackTrace(); } if (inet != null) { ipAddress = inet.getHostAddress(); } } } // 处理多级反向代理情况 if (ipAddress != null && ipAddress.length() > 15) { int commaIndex = ipAddress.indexOf(","); if (commaIndex > 0) { ipAddress = ipAddress.substring(0, commaIndex); } } return ipAddress;}
三、实现注意事项
通过以上方法,可以实现对用户真实IP地址的准确获取,并优化反向代理配置,提升应用的稳定性和可维护性。