首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使IPv4请求IP使用IPv4符号而不是IPv6

使IPv4请求IP使用IPv4符号而不是IPv6
EN

Stack Overflow用户
提问于 2017-01-29 04:20:38
回答 1查看 1.2K关注 0票数 1

Express req.ip (其中req是请求),但是对于IPv4地址,它使用IPv6符号,例如:

代码语言:javascript
复制
::ffff:1.2.3.4

我很高兴它不费吹灰之力地支持IPv6,但是为了UI的目的,我想用IPv4符号("1.2.3.4")显示IPv4地址,当然,它仍然支持IPv6地址。

我可以让Express使用纯IPv4符号来处理IPv4请求地址吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-29 04:44:07

嗯,我找到了一种使用ipaddr.js模块的方法,这是我通过这个答案找到的。该模块可用于检查IPv6地址是否为IPv4地址,如果是,则进行转换。例如:

代码语言:javascript
复制
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'));

产出:

代码语言:javascript
复制
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

这就是我想要的。我不介意增加另一个依赖项,所以这似乎没问题。

假设模块实现正确,这将为任何形式的IPv6 4和IPv6 6兼容地址提供完全支持。

对于好奇的人,这里有一个更完整的测试:

代码语言:javascript
复制
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')

其中产出:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41917564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档