CNode

node获取客户端ip问题

问答
Iim-here发布于10 年前最后回复10 年前4 回复14966 浏览0 收藏

之前用的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)

R
raymonife#1·10 年前

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

I
im-here#2·10 年前
引用 raymonife从0.12.x(大概是,具体不记得了)开始,http.createServer().listen()的默认是ipv6,你可以改成.listen(port, "0.0.0.0")强制指定为ipv...

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

R
raymonife#3·10 年前

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

I
im-here#4·10 年前
引用 raymonifenet.Server.prototype.listen() will now try to bind to :: (IPv6) if the bind address is omitted, ...

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

参与回复
登录后即可参与回复。登录