zl程序教程

您现在的位置是:首页 >  Java

当前栏目

Nginx反向代理后获取用户真实IP地址

2023-02-18 16:35:10 时间
问题描述:nginx集群后无法获取用户真实的IP地址,得到的一直都是前端代理服务器。Nginx的地址有2台Nginx服务器,1台代理nacos集群,一台代理vue前端项目。在登录前端页面时一直无法获取到真实的用户IP地址,获取到的是代理前端服务器的地址

解决方法:

在代理的后端地址中加上如下代码:
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

完整代码:

location /api/ {
 	proxy_set_header   Host  $host;
 	proxy_set_header   X-Real-IP $remote_addr;
 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 	proxy_pass  http://xxxxxxx:8080/;  //代理的后端接口地址
}
java获取IP地址:
public String getRequestIp(HttpServletRequest request) {
	String ip = request.getHeader("x-forwarded-for");
	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
		ip = request.getHeader("Proxy-Client-IP");
	}
	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
		ip = request.getHeader("WL-Proxy-Client-IP");
	}
	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
		ip = request.getHeader("HTTP_CLIENT_IP");
	}
	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
		ip = request.getHeader("HTTP_X_FORWARDED_FOR");
	}
	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
		ip = request.getRemoteAddr();
	}
	return ip;
}