获取远程ip的几种方法解释和不同

在接口和程序开发过程中,我们一定会遇到要获取请求者ip的情况,获取ip用来获取用户地址,或者防止用户刷我们的接口等等,总有需要获取用户的ip,怎样才能获取真实,可靠的ip呢!

在php开发过程中,有这么几种ip:

client_ip:客户的ip地址,一般是在header中传递过来,获取方式 $_SERVER[‘HTTP_CLIENT_IP’]

X_FORWARDED_FOR:这是代理的时候,代理或把IP添加到这里边,格式为 ip1,ip2,ip3, 这样的形式,第一个是用户的ip,后边是各级代理的ip,它的传递也是通过header传递的

remote_ip:这个ip好,它是与你直连的ip,真正与你交互的ip,这个没有放到header中,这个而且也改不了

上边简单说了几种ip,看完后你一定想前两个在header中传递过来的,不安全,不是用,应该是用第三个。是这样的,一般情况中,我们都是用remote_ip,与我们直接连接的ip,你会说,用户代理,我们怎么办,实际上,我们真没啥办法,普通代理会把ip放到X_FORWARDED_FOR中,但高匿的就不会放到里边,所以,你还是无法真正的拿到用户的ip,只能拿到与我们直连的ip,这相对来说真实,不可以修改,防刷,我们也只能防这个ip!

看完上边也许你认为写完了,没有,还有一点要介绍,首先说个情况,现在大多数公司内部的应用都不是直接被访问的,而是内部也通过了层层代理后才到你真正的程序端,这时候你拿到的remote_ip已经不是真正用户的ip啦,而是你公司内部最后一个代理的ip,但你可能说,我们公司我一直用remote_ip拿,拿到的是用户的真实ip啊,哈哈,你这里有一点没有弄清楚,你拿到的是真的,但这个真的,是运维同学帮你处理好的,以nginx为例,运维的同学们都一层一层帮你做了转发真实ip,nginx中每层代理,都把上层的正式ip映射到remote_ip中,所以,你拿到了真实的ip.这里还有一种情况,不放到reomote_ip中,而是内部代理的时候,把各层的代理都放到X_FORWARDED_FOR中,同时也会把用户真实的ip放到里边,这样的话,你就需要自己解析X_FORWARDED_FOR,看运维大大给你放到了开头还是结尾,你自己拿到X_FORWARDED_FOR后,自己解析一下!

所以,到真实环境中,你的程序可能在多个地方去拿这个ip,需要根据真实配置去取,这里并不是一成不变的!就向上边的X_FORWARDED_FOR和remote_ip,有时候你会取X_FORWARDED_FOR,有时候会取remote_ip!理解原理,你就用户都取不错!