node获取客户端ip问题
发布于 9 年前 作者 im-here 13950 次浏览 最后一次编辑是 8 年前 来自 问答

之前用的node版本是0.10.32 1.本机访问,拿到的ip是127.0.0.1; 2.别的机器方式,拿到的ip就是别的机器的ip,假如我部署在局域网内,内网访问拿到的ip格式如下:192.168.1.xxx。 后来我node版本切到4.4.3的时候,出现了问题 1.本机访问,拿到的IP是 ::1 2.别的机器访问,拿到的ip是::ffff:192.168.0.2 这什么原因呢?代码如下:

function getClientIp (req) {
    var ipAddress;
    var forwardIpStr = req.headers['x-forwarded-for'];
    if (forwardIpStr) {
        var forwardIp = forwardIpStr.split(',');
        ipAddress = forwardIp[0];
    }
    if (!ipAddress) {
        ipAddress = req.connection.remoteAdress;
    }
    if (!ipAddress) {
        ipAddress = req.socket.remoteAdress;
    }
    if (!ipAddress) {
        if (req.connection.socket) {
            ipAddress = req.connection.socket.remoteAdress;
        }
        else if (req.headers['remote_addr']) {
            ipAddress = req.headers['remote_addr'];
        }
        else if (req.headers['client_ip']) {
            ipAddress = req.headers['client_ip'];
        }
        else {
            ipAddress = req.ip;
        }

    }
    return ipAddress;
};
4 回复

从0.12.x(大概是,具体不记得了)开始,http.createServer().listen()的默认是ipv6,你可以改成.listen(port, “0.0.0.0”)强制指定为ipv4. 应该能解决你的问题。

@raymonife 意思就是说从0.12.x开始,取到的ip都是ipv6格式导致的? 不过按你说的改了之后,拿到的ip确实正常了。

net.Server.prototype.listen() will now try to bind to :: (IPv6) if the bind address is omitted, and use 0.0.0.0 (IPv4) as a fallback. 监听的是ipv6,文档里有提到:https://iojs.org/api/net.html#net_server_listen_port_hostname_backlog_callback

@raymonife 嗯,我刚才也看了下API。 不过我发现代码在ubuntu上运行获取ip没有什么问题。就windows上有这个问题

回到顶部