如何使用PHP重定向整个IP地址范围/块?

如何使用PHP重定向整个IP地址范围/块?,php,redirect,ip,Php,Redirect,Ip,我使用以下代码片段重定向IP地址数组。我想知道如何将整个IP地址范围/块添加到我的阵列中 <?php // Let's redirect certain IP addresses to a "Page Not Found" $disallowed = array("76.105.99.106"); $ip = $_SERVER['REMOTE_ADDR']; if(in_array($ip, $disallowed)) { header("Location: http://googl

我使用以下代码片段重定向IP地址数组。我想知道如何将整个IP地址范围/块添加到我的阵列中

<?php // Let's redirect certain IP addresses to a "Page Not Found"
$disallowed = array("76.105.99.106");
$ip = $_SERVER['REMOTE_ADDR']; 

if(in_array($ip, $disallowed)) {
 header("Location: http://google.com");
 exit;
}
?>

最好在apache(或任何其他服务器)中执行此操作。

您到底对阻止谁感兴趣?您可以使用PHP或apache阻止(或允许)一组特定的IP地址

例如,如果您对阻止来自整个国家的人感兴趣,那么有一些工具可以为您提供需要阻止的IP地址。不幸的是,这并不像指定一个范围那么简单


查看哪些生成的ip地址可以保留在.htaccess中以阻止整个国家/地区。

尝试
substr
功能:

$ip = '76.105.99.';
if (substr($_SERVER['REMOTE_ADDR'], 0, strlen($ip)) === $ip) {
    // deny access
}

我相信您需要创建一个for循环来将每个IP地址(在范围内)添加到阵列中

伪码

for i = 0 to 255
    disallowed[i] = "76.105.99." + i
next

以下是如何检查特定网络/掩码组合的示例:

$network=ip2long("76.105.99.0");
$mask=ip2long("255.255.255.0");
$remote=ip2long($_SERVER['REMOTE_ADDR']);

if (($remote & $mask)==$network)
{
    header("Location: http://example.com");
    exit;
}

这比使用基于字符串的匹配更好,因为您可以测试在八位字节内对齐的其他掩码,例如IP的/20块。您可以以不同的方式处理问题

如果您想禁止76.105.99.*您可以:

if (strpos($_SERVER['REMOTE_ADDR'], "76.105.99.")!==FALSE)
{
    header ('Location: http://google.com');
} 

您需要做的是进行测试,以查看特定地址是否位于CIDR定义的特定地址范围内

例如,你需要能够说

是192.168.1.5

里面

192.168.1.0/24

该函数很容易编写,假设您有一些基本工具来完成CIDR工作

假设您在32位系统上,这个类 注意IPisWithinCIDR函数

$blocked\u ip\u range\u array=array('109.237.108.0','109.238.0.0');
$blocked_ip_range_array = array('109.237.108.0','109.238.0.0');
for($i=0;$i<count($blocked_ip_range_array);$i++){
    $network=ip2long($blocked_ip_range_array[$i]);
    $blipr = explode(".",$blocked_ip_range_array[$i]);
    if($blipr[2]=='0'){
        $mask=ip2long("255.255.0.0");
    }
    else{
        $mask=ip2long("255.255.255.0");
    }
    $remote=ip2long($_SERVER['REMOTE_ADDR']);
    if (($remote & $mask)==$network)
    {
        header("Location: http://xurcun.info");
        exit;
    }
}    

对于($i=0;$i),下面是一个URL,显示了与Dixon先生和Ameer先生讨论的内容非常相似的内容:

希望这有帮助

恭敬地,
Wil

我认为您需要重新设计比较代码,以理解您将要使用的缩写。执行for循环似乎是一个次优的解决方案。您做了一些错误的事情,或者做出了一个无效的假设。我的代码在这里:
它总是说不匹配。注意:我的IP是124.195.223.99您的网络地址无效,对于您提供的掩码应该为零。如果最后一个八位字节为98,我应该使用哪个掩码?实际上,IP范围从98开始,以125结束。此技术仅适用于与CIDR样式的NetBlock进行匹配。出于您的目的,您可以简单地将范围的开始和结束转换为long,然后查看是否您要测试的ip在该范围内。先生,如果ip范围的格式为76.105.99.0/127怎么办?