缘由
今天偶然碰到一个需求,需要获取客户端真实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、遇到问题的时候,不妨考虑下查查官方文档