【问题标题】:Making IPv4 request IP use IPv4 notation instead of IPv6使 IPv4 请求 IP 使用 IPv4 表示法而不是 IPv6
【发布时间】:2017-06-14 12:39:44
【问题描述】:

表达provides the request IP address via req.ip(其中req是请求),但对于IPv4地址它使用IPv6 notation,例如:

::ffff:1.2.3.4

我很高兴它毫不费力地支持 IPv6,但出于 UI 目的,我想以 IPv4 表示法(“1.2.3.4”)显示 IPv4 地址,同时当然仍保持对 IPv6 地址的支持。

我能否让 Express 对 IPv4 请求地址使用纯 IPv4 表示法?

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    好吧,我找到了一种使用ipaddr.js module 的方法,我通过this answer 找到了它。该模块可用于检查 IPv6 地址是否为 IPv4 地址,如果是则转换。例如:

    var ip = require('ipaddr.js')
    
    function cleanupAddress (str) {
        // if it's a valid ipv6 address, and if its a mapped ipv4 address,
        // then clean it up. otherwise return the original string.
        if (ip.IPv6.isValid(str)) {
            var addr = ip.IPv6.parse(str);
            if (addr.isIPv4MappedAddress())
                return addr.toIPv4Address().toString();
        }
        return str
    }
    
    console.log(cleanupAddress('1.2.3.4'));
    console.log(cleanupAddress('::ffff:1.2.3.4'));
    console.log(cleanupAddress('::ffff:102:304'));
    console.log(cleanupAddress('0:0:0:0:0:ffff:1.2.3.4'));
    console.log(cleanupAddress('::1'));
    console.log(cleanupAddress('2001:0db8:85a3:0000:0000:8a2e:0370:7334'));
    

    输出:

    1.2.3.4
    1.2.3.4
    1.2.3.4
    1.2.3.4
    ::1
    2001:0db8:85a3:0000:0000:8a2e:0370:7334
    

    这就是我想要的。我不特别介意添加另一个依赖项,所以这看起来不错。

    假设该模块被正确实现,这应该为任何形式的 IPv4 和 IPv6 兼容地址提供全面支持。


    这里有一个针对好奇者的更完整的测试:

    var ip = require('ipaddr.js')
    
    function test (str) {
        console.log(str);
        console.log('  IPv4.isValid:', ip.IPv4.isValid(str));
        console.log('  IPv6.isValid:', ip.IPv6.isValid(str));
        if (ip.IPv6.isValid(str)) {
            var addr = ip.IPv6.parse(str);
            console.log('  IPv6.parse.toString:', addr.toString());
            console.log('  IPv6.isIPv4MappedAddress:', addr.isIPv4MappedAddress());
            if (addr.isIPv4MappedAddress()) {
                console.log('  IPv6.toIPv4Address.toString:', addr.toIPv4Address().toString());
            }
        }
    }
    
    test('1.2.3.4')
    test('::ffff:1.2.3.4')
    test('0:0:0:0:0:ffff:1.2.3.4')
    test('::1')
    test('2001:0db8:85a3:0000:0000:8a2e:0370:7334')
    

    哪些输出:

    1.2.3.4
      IPv4.isValid: true
      IPv6.isValid: false
    ::ffff:1.2.3.4
      IPv4.isValid: false
      IPv6.isValid: true
      IPv6.parse.toString: ::ffff:102:304
      IPv6.isIPv4MappedAddress: true
      IPv6.toIPv4Address.toString: 1.2.3.4
    0:0:0:0:0:ffff:1.2.3.4
      IPv4.isValid: false
      IPv6.isValid: true
      IPv6.parse.toString: ::ffff:102:304
      IPv6.isIPv4MappedAddress: true
      IPv6.toIPv4Address.toString: 1.2.3.4
    ::1
      IPv4.isValid: false
      IPv6.isValid: true
      IPv6.parse.toString: ::1
      IPv6.isIPv4MappedAddress: false
    2001:0db8:85a3:0000:0000:8a2e:0370:7334
      IPv4.isValid: false
      IPv6.isValid: true
      IPv6.parse.toString: 2001:db8:85a3::8a2e:370:7334
      IPv6.isIPv4MappedAddress: false
    

    【讨论】:

      猜你喜欢
      • 2021-10-27
      • 2016-01-07
      • 2017-06-24
      • 1970-01-01
      • 2012-10-24
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      相关资源
      最近更新 更多