PHP $ _SERVER ['REMOTE_ADDR']显示IPv6

Bri*_*esh 9 php ipv6

我在PHP中面临$ _SERVER ['REMOTE_ADDR']的问题即使服务器使用IPv4,它也会提供类似IPv6的值.

任何人都可以帮我解决这个问题.

San*_*ann 24

然后,服务器接受IPv6套接字上的连接.某些操作系统可以在IPv6套接字上同时执行IPv4和IPv6.当发生这种情况时,IPv6地址看起来像::ffff:192.0.2.123或者::ffff:c000:027b是相同的地址,但是用十六进制编写.

如果你看到这样的IPv6地址2a00:8640:1::224:36ff:feef:1d89,然后你的服务器确实通过IPv6可达:-)

无论如何,要将所有内容转换回规范形式,您可以使用以下内容:

// Known prefix
$v4mapped_prefix_hex = '00000000000000000000ffff';
$v4mapped_prefix_bin = pack("H*", $v4mapped_prefix_hex);

// Or more readable when using PHP >= 5.4
# $v4mapped_prefix_bin = hex2bin($v4mapped_prefix_hex); 

// Parse
$addr = $_SERVER['REMOTE_ADDR'];
$addr_bin = inet_pton($addr);
if( $addr_bin === FALSE ) {
  // Unparsable? How did they connect?!?
  die('Invalid IP address');
}

// Check prefix
if( substr($addr_bin, 0, strlen($v4mapped_prefix_bin)) == $v4mapped_prefix_bin) {
  // Strip prefix
  $addr_bin = substr($addr_bin, strlen($v4mapped_prefix_bin));
}

// Convert back to printable address in canonical form
$addr = inet_ntop($addr_bin);
Run Code Online (Sandbox Code Playgroud)

使用此代码时,输​​入以下内容之一:

::ffff:192.000.002.123
::ffff:192.0.2.123
0000:0000:0000:0000:0000:ffff:c000:027b
::ffff:c000:027b
::ffff:c000:27b
192.000.002.123
192.0.2.123
Run Code Online (Sandbox Code Playgroud)

您始终将规范的IPv4地址192.0.2.123作为输出.

当然,IPv6地址作为规范的IPv6地址返回:2a00:8640:0001:0000:0224:36ff:feef:1d89变为2a00:8640:1::224:36ff:feef:1d89等.

  • inet_pton("192.000.002.123")给出一个警告,并在PHP 5.3.6-10上返回false. (2认同)