nodejs 獲取客戶端 ip 地址


應用場景:

php:我們需要拿到用戶客戶端的ip信息,以識別用戶位置,但現在我們拿到的地址永遠是杭州

前端:我查一下,稍等 .... 明白了,我們加了一層 node 服務器,服務器在杭州,你們拿到的是 node 服務器的 ip

php:那怎么辦?

前端:我給你加一個 ip 字段吧

php:哦~

前端:(噼里啪啦噼里啪啦......) 好了,你們看一下有值了嗎?

php:有了,但值不對,你給我傳的是  ::ffff:127.0.0.1 ,前邊那一堆 f 是什么鬼,去掉,我們只要后邊的 ip 就可以了

前端:哦~ 稍等....... 

 

分析原因:

前端給 php 傳遞的 ip 字段值是 req.connection.remoteAddress ,但 php 實際拿到是 ipv6 的地址。

 

nodejs 官網 API:

net 模塊查找 server.listen()

server.listen([port][, host][, backlog][, callback])

啟動一個TCP服務監聽輸入的 port 和 host.

如果 host 省略,如果 ipv6 可用,服務器將會接收基於 unspecified IPv6 address (::)的連接,否則接收 unspecified IPv4 address (0.0.0.0) 的鏈接

 

修改方法:

指定 host 參數為 0.0.0.0,也就是 listen(port, '0.0.0.0', () => {});

例如:

 

總結:

/**
 * @getClientIP
 * @desc 獲取用戶 ip 地址
 * @param {Object} req - 請求
 */
function getClientIP(req) {
    return req.headers['x-forwarded-for'] || // 判斷是否有反向代理 IP
        req.connection.remoteAddress || // 判斷 connection 的遠程 IP
        req.socket.remoteAddress || // 判斷后端的 socket 的 IP
        req.connection.socket.remoteAddress;
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM