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

Posted 秦晓宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx:3Nginx代理接口后导致后台获取接口都为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已经显示出来了。

以上是关于Nginx:3Nginx代理接口后导致后台获取接口都为127.0.0.1或0.0.0.0.0.0的主要内容,如果未能解决你的问题,请参考以下文章

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

nginx利用反向代理调试后台接口

vue项目nginx必备配置-----API 接口代理

Nginx配置代理解决本地html进行ajax请求接口跨域问题

nginx 代理时 HTTP header配置错误导致系统问题

nginx代理,tomcat部署服务器,后端获取客户端真实ip