1
<?php 
    $iprange = array( 
        "^12\.34\.", 
        "^12\.35\.", 
        ); 
    foreach($iprange as $var) { 
        if (preg_match($var, $_SERVER['REMOTE_ADDR'])) {

我正在寻找一个列表,它将构成数组中的每个值。让我们称之为它iprange.txt,我将从中提取变量$iprange。我也会用新的范围更新文件,但如果这是 php 中需要的东西,我也想将这些字符串转换为正则表达式,就像上面的例子一样。

如果你能帮助我解决以下两个问题:

  1. 我知道我会以某种方式使用数组包含,但我不确定如何实现它。

  2. 如果您认为 regexp 是一个好主意并且没有其他选择,我想运行一个 cron 来更新文本文件并将其转换为可以在上述示例中使用的 regexp。我知道如何在 directadmin gui 中应用 cron,但我不知道 cronned 文件会是什么样子。

编辑 - - - - - - - - - - - -

谢谢 Mamsaac,非常有帮助,现在我被困在与案例和 ob_file_callback 相关的进一步问题上,如果我在这里开始谈论它们,我将一无所获,但可以在此处关注它们:ob_file_callback 和 fwrite 的问题

至于这里的这个线程,为了保持话题,我想问你如何在你建议的数组中包含整个文件?

如果我不必将字符串转换为正则表达式,我就不再需要您正在考虑的 cronjob。

4

2 回答 2

2

如果你同意的话,我会提出一种不同的方法来解决这个问题。

您可以尝试ip2long()为此使用函数,从而更快地进行比较。这样做的好处是您可以对每个范围非常具体(并且以自然的方式,范围意味着“两个数字之间”。

所以,你可以这样做:

$ranges = array('10.20.8.0-10.20.14.254', '192.168.0.2-192.168.0.254');
foreach ($ranges as $iprange) {
    list($lowerip, $highip) = explode('-', $iprange);
    $remoteip = ip2long($_SERVER['REMOTE_ADDR']);
    if (ip2long($lowerip) <= $remoteip && $remoteip <= ip2long($highip)) {
        //it is within this range! I don't know what you want to do with it.
    }
}

您也可以使用网络掩码,但我将把它留给您作为练习。为此,您将使用按位运算进行一些操作。否定掩码,然后使用和按位和操作......不是你要求的!我可能会在我睡觉后更新这个。

关于文件和 cronjob。我绝对不确定您为什么要为此使用 cronjob。您如何决定将接受哪些新范围?

您始终可以读取文件(如果您愿意,可以使用 file_get_contents 并使用

$ranges = explode("\n", file_get_contents("filename")) ;

然后你就可以准备好你的阵列了。(请注意,我什至将其称为与上面的块代码相同)。如果文件变得非常大,请避免使用上述方法并继续使用 fopen 和 fgets 方法:

$file = @fopen("filename", "r"); //suppressing error messages, probably don't want that
if (!$file) { 
    //for some reason the file didn't open. Do error reporting or checking
}
$ranges = array();
while (($line = fgets($file)) !== false) {
    $ranges[] = $line;
}

好像我只是想念你为什么要使用 cronjob。请详细说明您决定添加新 IP 范围的标准。

于 2012-10-04T09:32:56.223 回答
0
    $ranges = array('12.34.1.0-12.34.14.254', '192.168.0.2-192.168.0.254');
foreach ($ranges as $iprange) {
    list($lowerip, $highip) = explode('-', $iprange);
    $remoteip = ip2long($_SERVER['REMOTE_ADDR']);

    if (ip2long($lowerip) <= $remoteip && $remoteip <= ip2long($highip)) {
    }
}
    header("LOCATION: page1.php");
    }
else
    {
    header("LOCATION: page2.php");
    }
?>

我已经隔离了 if else 并且效果很好。我还在我的 if else 之前和之后都将两个 '}' 放在了脚本的末尾,但没有运气。

于 2012-10-05T07:30:25.860 回答