php 如何知道客户端在连接到我的服务器时使用的是哪个版本的 Internet 协议 (IP)?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1448871/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 02:37:31  来源:igfitidea点击:

How to know which version of the Internet Protocol (IP) a client is using when connecting to my server?

php

提问by Mukesh Chapagain

I want to check via php if someone connects to my site via IPv4 or IPv6.

我想通过 php 检查是否有人通过 IPv4 或 IPv6 连接到我的站点。

The client address can be found in $_SERVER["REMOTE_ADDR"]buthow to check if it's IPv4 or IPv6 ?

可以在其中找到客户端地址,$_SERVER["REMOTE_ADDR"]但是如何检查它是 IPv4 还是 IPv6 ?

回答by Mukesh Chapagain

Check for IPv4

检查 IPv4

$ip = "255.255.255.255";
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {    
    echo "Valid IPv4";
}
else {
    echo "Invalid IPv4";
}

Check for IPv6

检查 IPv6

$ip = "FE80:0000:0000:0000:0202:B3FF:FE1E:8329";    
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
    echo "Valid IPv6";
}
else {
    echo "Invalid IPv6";
}

For more, check PHP function filter_varsand list of filters for validation.

有关更多信息,请查看 PHP 函数filter_varslist of filters for validation.

回答by Cem Kalyoncu

You can use this:

你可以使用这个:

function ipVersion($txt) {
     return strpos($txt, ":") === false ? 4 : 6;
}

回答by kelunik

You can use inet_pton:

您可以使用inet_pton

<?php

$packedIp = @inet_pton($ip);

if ($packedIp === false) {
    // invalid IP
} else if (isset($packedIp[4])) {
    // IPv6
} else {
    // IPv4
}

回答by Pascal MARTIN

What about counting the number of '.'and/or ':' in $_SERVER["REMOTE_ADDR"]?

计算'.'和/或 ' :'的数量怎么样$_SERVER["REMOTE_ADDR"]

If there is more than 0 ':', and no '.' symbol in $_SERVER["REMOTE_ADDR"], I suppose you can consider you user is connected via IPv6.

如果 ' :'多于 0 个,并且 中没有 ' .' 符号$_SERVER["REMOTE_ADDR"],我想您可以认为您的用户是通过 IPv6 连接的。


Another solution might be to use the filter extension: there are constants(see the end of the page)that seem to be related to IPv4 and IPv6 :


另一种解决方案可能是使用过滤器扩展:有些常量(见页面末尾)似乎与 IPv4 和 IPv6 相关:

FILTER_FLAG_IPV4(integer)
Allow only IPv4 address in "validate_ip" filter.

FILTER_FLAG_IPV6(integer)
Allow only IPv6 address in "validate_ip" filter.

FILTER_FLAG_IPV4(整数)
在“validate_ip”过滤器中只允许 IPv4 地址。

FILTER_FLAG_IPV6(整数)
在“validate_ip”过滤器中只允许 IPv6 地址。

回答by Michael Hampton

Since the highest voted answer has a rather significant problem, I'm going to share my own.

由于投票最高的答案有一个相当重要的问题,我将分享我自己的。

This returns true if an address which appears to be IPv6 is passed in, and false if an address which appears to be IPv4 (or IPv4-mapped IPv6) is passed in. The actual addresses are not further validated; use filter_var()if you need to validate them.

如果传入的地址看起来是 IPv6,则返回 true,如果传入的地址看起来是 IPv4(或 IPv4 映射的 IPv6),则返回 false。实际地址未进一步验证;使用filter_var()如果您需要验证他们。

function is_ipv6($address) {
    $ipv4_mapped_ipv6 = strpos($address, "::ffff:");
    return (strpos($address, ":") !== FALSE) &&
           ($ipv4_mapped_ipv6 === FALSE || $ipv4_mapped_ipv6 != 0);
}

回答by yfeldblum

IPv4 addresses all match the regex /^\d{1,3}(\.\d{1,3}){3,3}$/.

IPv4 地址都与 regex 匹配/^\d{1,3}(\.\d{1,3}){3,3}$/

回答by Mostafa Soufi

You can use AF_INET6to detect if PHP is compiled with IPv6 support:

您可以使用AF_INET6来检测 PHP 是否支持 IPv6 编译:

<?php
if ( defined('AF_INET6') ) {
    echo 'Yes';
} else {
    echo 'No';
}
?>