緣由
今天偶然碰到一個(gè)需求,需要獲取客戶端真實(shí)ip進(jìn)行管制
問題
然而問題來了幸冻,通過req.connection.remoteAddress
獲取的ip居然是長這樣的: ::ffff:192.168.0.1
。
分析
雖然獲取的這個(gè)ipv6的地址咳焚,也能使用洽损,可是我想要的只是一個(gè)簡簡單單的ipv4,因?yàn)槲乙峤唤o別的系統(tǒng),而不是我自己使用的啊革半。
搜索
一開始用的是百度碑定,搜了一頁居然找不到。哈哈又官,然后就使用谷歌了延刘。在cnode社區(qū)找到原因了。原來從某個(gè)nodejs版本開始六敬,http.createServer().listen()
默認(rèn)是ipv6的碘赖,所以,為了達(dá)到我想要的效果,只能是將.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的話叮趴,當(dāng)前這個(gè)服務(wù)器會接受任何ipv6的主機(jī)來訪問(如果有ipv6的話),否則使用ipv4权烧。所以眯亦,當(dāng)只需要獲取遠(yuǎn)程客戶端的ip的時(shí)候,需要指定hostname
參數(shù)為 0.0.0.0
般码,也就是 .listen(post, '0.0.0.0')
妻率。
驗(yàn)證
當(dāng)設(shè)置了ipv4格式后,每當(dāng)用戶訪問板祝,通過req.connection.remoteAddress
能獲取到用戶的ipv4地址宫静。::ffff:192.168.0.1
---> 192.168.0.1
小結(jié)
1、盡量使用谷歌搜索問題
2券时、遇到問題的時(shí)候孤里,不妨考慮下查查官方文檔