第一种 本地访问 获取到ip获取到0:0:0:0:0:0:0:1
问题原因: 这种情况只有在服务器和客户端都在同一台电脑上才会出现(例如用localhost访问的时候才会出现)
搞定方法:
- 本机访问的时候用127.0.0.1或本机ip代替localhost即可解决
- /etc/hosts这个东西作怪(在windows上应该是C:\Windows\System32\drivers\etc\hosts这个文件),只需要注释掉文件中的 # ::1 localhost 这一行即可解决问题
第二种 代理访问获取到的ip,如何获取真实ip
第一种情况:不通过代理上网,服务器端拿到真实IP
第二种情况:通过代理服务器如:Nginx,Squid等一层代理或多层代理上网,如下图:
nginx一般转发都是
从X-Forwarded-For的定义来看,ips[0]才是原始客户端ip,如果这个都不是,那拿第二个就更不靠谱了,我们平时检验的时候,可能是直接在内网挂代理去访问的,跟外面网友访问经过的网络路径不一样,后面不停添加的是经过的每一层代理ip才对,下面举例说明;
所以访问的流程应该是这样,客户端58.63.227.162发出请求,经过192.168.237.178, 192.168.238.218两层转发,到了192.168.239.196这台NGINX上,NGINX就把X-Real-IP头设成了自己看到的remote_addr,也就是直接发给到他的192.168.238.218,这时候resin收到这个包,对resin来说直接发给他的remote_addr就是NGINX的ip,也就是192.168.239.196,那么resin里面的request.getRemoteAddr()就是192.168.239.196,那么在resin里拿最原始的ip逻辑(也就是拿能够知道的最外层的ip)应该是这样:
如果XFF不为空,拿XFF的左边第一个
如果XFF为空,拿XRI
如果XRI为空,只能拿request.getRemoteAddr(),也就是只能拿到最直接发给他的机器ip了,
推荐代码这么写