我希望检测地址IP是本地还是外部。在Web应用程序中,我的客户希望通过本地网络上的samba直接访问文件,如果您不在网络中,则通过下载链接访问文件。
我可能只是检查我的IP是否为172.30.*.*
,但如果我的客户切换到1 0.*.*.*
或IPV6,它将不再有效。
我可以使用config var,因此客户可以随意更改它。我希望它是自动的,没有配置var。
你会怎么做?
答案 0 :(得分:7)
根据需要更新IP范围列表。我有一段时间没有更新这个列表,但它应该有最多。对不起,我从未添加过IPv6支持。
function reserved_ip($ip)
{
$reserved_ips = array( // not an exhaustive list
'167772160' => 184549375, /* 10.0.0.0 - 10.255.255.255 */
'3232235520' => 3232301055, /* 192.168.0.0 - 192.168.255.255 */
'2130706432' => 2147483647, /* 127.0.0.0 - 127.255.255.255 */
'2851995648' => 2852061183, /* 169.254.0.0 - 169.254.255.255 */
'2886729728' => 2887778303, /* 172.16.0.0 - 172.31.255.255 */
'3758096384' => 4026531839, /* 224.0.0.0 - 239.255.255.255 */
);
$ip_long = sprintf('%u', ip2long($ip));
foreach ($reserved_ips as $ip_start => $ip_end)
{
if (($ip_long >= $ip_start) && ($ip_long <= $ip_end))
{
return TRUE;
}
}
return FALSE;
}
var_dump(reserved_ip('127.0.0.1')); // reserved (localhost)
var_dump(reserved_ip('74.125.140.101')); // not reserved (Google)
答案 1 :(得分:3)
不幸的是,没有简单的方法可以肯定地确定这一点。请参阅我的评论,了解一个有趣的例子。
在IPv4世界中,您可以尝试这样做:确定服务器的外部IP地址(例如使用http://ip-address.domaintools.com/myip.xml)并将其与客户端的套接字远程地址($_SERVER['REMOTE_ADDR']
)进行比较。如果它们是相同的,那么你在同一个网络上运行,如果它们不同,那么它就是一个不同的网络。
在IPv6世界(正确部署的网络)中,没有专用网络,每个设备到处都有自己的公共IP地址。在这种情况下,确定您是否是本地的唯一方法是维护本地设备的完整列表。
答案 2 :(得分:0)
我不确定但是尝试使用
$_SERVER['SERVER_ADDR']
$_SERVER['SERVER_PORT']
$_SERVER['REMOTE_ADDR']
答案 3 :(得分:0)
我假设您将内部定义为0路由器跳跃?
使用以下解决方案:
How do I find my server's IP address in PHP(CLI)
动态确定SERVER的IP地址和网络掩码值。然后,您应该能够确定客户端是否是远程的。
如果内部网络包含路由子网(一个或多个路由器跳跃)我无论如何都不会想到使检测动态化,您需要静态定义内部IP范围。