PHP $_SERVER [‘REMOTE_ADDR’]显示IPv6

前端之家收集整理的这篇文章主要介绍了PHP $_SERVER [‘REMOTE_ADDR’]显示IPv6前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在 PHP中遇到了$_SERVER [‘REMOTE_ADDR’]的问题
即使服务器使用IPv4,它也会提供类似IPv6的值.

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

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

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

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

  1. // Known prefix
  2. $v4mapped_prefix_hex = '00000000000000000000ffff';
  3. $v4mapped_prefix_bin = pack("H*",$v4mapped_prefix_hex);
  4.  
  5. // Or more readable when using PHP >= 5.4
  6. # $v4mapped_prefix_bin = hex2bin($v4mapped_prefix_hex);
  7.  
  8. // Parse
  9. $addr = $_SERVER['REMOTE_ADDR'];
  10. $addr_bin = inet_pton($addr);
  11. if( $addr_bin === FALSE ) {
  12. // Unparsable? How did they connect?!?
  13. die('Invalid IP address');
  14. }
  15.  
  16. // Check prefix
  17. if( substr($addr_bin,strlen($v4mapped_prefix_bin)) == $v4mapped_prefix_bin) {
  18. // Strip prefix
  19. $addr_bin = substr($addr_bin,strlen($v4mapped_prefix_bin));
  20. }
  21.  
  22. // Convert back to printable address in canonical form
  23. $addr = inet_ntop($addr_bin);

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

  1. ::ffff:192.000.002.123
  2. ::ffff:192.0.2.123
  3. 0000:0000:0000:0000:0000:ffff:c000:027b
  4. ::ffff:c000:027b
  5. ::ffff:c000:27b
  6. 192.000.002.123
  7. 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等

猜你在找的PHP相关文章