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

配列内の各値を構成するリストを探しています。それを と呼びましょう。iprange.txtそこから変数を抽出します$iprange。また、新しい範囲でファイルを更新しますが、上記の例のように、php で必要な場合は、これらの文字列を正規表現に変換したいと考えています。

次の 2 つの問題について教えていただければ、

  1. どういうわけか配列インクルードを使用することになることは理解していますが、それを実装する方法がわかりません。

  2. テキスト ファイルを更新する cron を実行して、上記の例で使用できる正規表現に変換したいと思います。directadmin GUI で cron を適用する方法は知っていますが、cron 化されたファイルがどのようになるかはわかりません。

編集 - - - - - - - - - - - -

Mamsaac に感謝します。非常に役に立ちました。現在、ケースと ob_file_callback に関連して発生しているさらなる問題で立ち往生しています。ここでそれらについて話し始めると、どこにも行きませんが、ここでフォローできます。ob_file_callback と fwrite の問題

ここのこのスレッドに関しては、トピックを維持するために、提案した配列にファイル全体を含めるにはどうすればよいですか?

文字列を正規表現に変換する必要がなければ、あなたが考えていた cronjob はもう必要ありません。

4

2 に答える 2

2

よろしければ、問題に対する別のアプローチを提案します。

このために関数を使用ip2long()して、比較をはるかに高速化することができます。この方法の利点は、各範囲を非常に具体的に指定できることです(そして、自然な方法で、範囲は「2つの数値の間」を意味します。

だから、あなたはそれを次のようにすることができます:

$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について。なぜこのためのcronジョブが必要なのか、私にはまったくわかりません。受け入れる新しい範囲をどのように決定していますか?

いつでもファイルを読み取ることができます(必要に応じて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 の前後に 2 つの「}」を配置しましたが、うまくいきません。

于 2012-10-05T07:30:25.860 に答える