Nginx:3、Nginx代理接口后导致后台获取接口都为127.0.0.1或0.0.0.0.0.0

1、问题

使用了Nginx代理接口后(请看上一屏文章),后台有一个IP获取的功能就失效了,所有获取的IP地址都是127.0.0.1或0.0.0.0.0.0。
这是因为代理之后后台识别的所有接口都以为是本地的。需要配置Nginx搭配后台获取的方法,获得设备的真实地址。

2、解决

2.1、Nginx配置:

    server {
        listen       443 ssl;
        server_name somnus.test.com;

        ssl_certificate      ../cert/(换成你的).pem;
        ssl_certificate_key  ../cert/(换成你的).key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_protocols TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    
		location /tc {
			#保留代理之前的host 包含客户端真实的域名和端口号
			proxy_set_header    Host  $host; 
			#保留代理之前的真实客户端ip
			proxy_set_header    X-Real-IP  $remote_addr;  
			#这个Header和X-Real-IP类似,但它在多级代理时会包含真实客户端及中间每个代理服务器的IP
			proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
			#表示客户端真实的协议(http还是https)
			proxy_set_header X-Forwarded-Proto $scheme;
			#指定修改被代理服务器返回的响应头中的location头域跟refresh头域数值
			#如果使用"default"参数,将根据location和proxy_pass参数的设置来决定。
			#proxy_redirect [ default|off|redirect replacement ];
			proxy_pass http://localhost:(换成你的)/tc/;
		}
	}

主要是这段

			#保留代理之前的host 包含客户端真实的域名和端口号
			proxy_set_header    Host  $host; 
			#保留代理之前的真实客户端ip
			proxy_set_header    X-Real-IP  $remote_addr;  
			#这个Header和X-Real-IP类似,但它在多级代理时会包含真实客户端及中间每个代理服务器的IP
			proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
			#表示客户端真实的协议(http还是https)
			proxy_set_header X-Forwarded-Proto $scheme;
			#指定修改被代理服务器返回的响应头中的location头域跟refresh头域数值
			#如果使用"default"参数,将根据location和proxy_pass参数的设置来决定。
			#proxy_redirect [ default|off|redirect replacement ];

2.2、Springboot代码

import com.alibaba.druid.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;

/**
 * IP地址
 *
 */
public class IPUtils {

	private static Logger logger = LoggerFactory.getLogger(IPUtils.class);

	/**
	 * 获取IP地址
	 * 
	 * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址
	 * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
	 */
	public static String getIpAddr(HttpServletRequest request) {
		String ip = null;
		try {
			ip = request.getHeader("x-forwarded-for");
			if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getHeader("Proxy-Client-IP");
			}
			if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getHeader("WL-Proxy-Client-IP");
			}
			if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getHeader("HTTP_CLIENT_IP");
			}
			if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getHeader("HTTP_X_FORWARDED_FOR");
			}
			if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getRemoteAddr();
			}
		} catch (Exception e) {
			logger.error("IPUtils ERROR ", e);
		}

		// 使用代理,则获取第一个IP地址
		if (StringUtils.isEmpty(ip) && ip.length() > 15) {
			if (ip.indexOf(",") > 0) {
				ip = ip.substring(0, ip.indexOf(","));
			}
		}

		return ip;
	}

}

3、运行效果

下图所示:我的本地IP已经显示出来了。
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值