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配置代理解决本地html进行ajax请求接口跨域问题