PHP $_SERVER['REMOTE_ADDR'] 显示 IPv6

问题描述 投票:0回答:1

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

谁能帮我解决这个问题。

php ipv6
1个回答
29
投票

服务器随后接受 IPv6 套接字上的连接。某些操作系统可以在 IPv6 套接字上同时执行 IPv4 和 IPv6。发生这种情况时,IPv6 地址将类似于

::ffff:192.0.2.123
::ffff:c000:027b
,它们是相同的地址,但以十六进制书写。

如果您看到类似

2a00:8640:1::224:36ff:feef:1d89
的 IPv6 地址,那么您的网络服务器确实可以通过 IPv6 访问 :-)

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

// Known prefix $v4mapped_prefix_hex = '00000000000000000000ffff'; $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);
使用此代码,当您输入以下其中一项时:

::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
您始终会获得规范的 IPv4 地址 

192.0.2.123

 作为输出。

当然,IPv6 地址会作为规范 IPv6 地址返回:

2a00:8640:0001:0000:0224:36ff:feef:1d89

 变为 
2a00:8640:1::224:36ff:feef:1d89
 等。

© www.soinside.com 2019 - 2024. All rights reserved.