首页 > 开发 > NodeJS > 正文

nodejs获取客户端真实ip默认是ipv6格式

2017-02-22 18:18:39  来源:cocakoala

缘由

今天偶然碰到一个需求,需要获取客户端真实ip进行管制


问题

然而问题来了,通过req.connection.remoteAddress获取的ip居然是长这样的: ::ffff:192.168.0.1 。


分析

虽然获取的这个ipv6的地址,也能使用,可是我想要的只是一个简简单单的ipv4,因为我要提交给别的系统,而不是我自己使用的啊。


搜索


一开始用的是百度,搜了一页居然找不到。哈哈,然后就使用谷歌了。在cnode社区找到原因了。原来从某个nodejs版本开始,http.createServer().listen()默认是ipv6的,所以,为了达到我想要的效果,只能是将.listen(port)改为.listen(port, '0.0.0.0')

于是我去查nodejs的api文档,看看能不能查到什么蛛丝马迹。 我简单地引用一段话.


Begin accepting connections on the specified port and hostname. If the hostname is omitted, the server will accept connections on any IPv6 address (::) when IPv6 is available, or any IPv4 address (0.0.0.0) otherwise

这段话的意思是说,如果没有指定hostname的话,当前这个服务器会接受任何ipv6的主机来访问(如果有ipv6的话),否则使用ipv4。所以,当只需要获取远程客户端的ip的时候,需要指定hostname参数为 0.0.0.0,也就是 .listen(post, '0.0.0.0')。


验证


当设置了ipv4格式后,每当用户访问,通过req.connection.remoteAddress能获取到用户的ipv4地址。::ffff:192.168.0.1 ---> 192.168.0.1


小结

1、尽量使用谷歌搜索问题

2、遇到问题的时候,不妨考虑下查查官方文档