2011-12-05 6 views
3

私はpreg_matchを使用して、参照URL ANDブロックとIPブロックを照合しています。どのようにして照会を探すように自分のコードに指示し、それが複数のIPブロックをチェックするのであれば?すなわち:70.xxx ORここpreg_match複数のIPですか?

96.xxxは、私のコードは、ちょうど持つ、これまでのところ、私は、これは単純な質問ですけど

<?php 
$referrer = $_SERVER['HTTP_REFERER']; 
$visitor = $_SERVER['REMOTE_ADDR']; 
if ((preg_match("/referrer-domain.com/",$referrer)) && (!preg_match("/70./",$visitor))){ 
echo "<meta http-equiv='refresh' content='0;url=http://www.new-domain.com'>"; 
} 
?> 

(1つのIPブロック「70.xxx」で動作するもの)であります今日は脳のおなら。

答えて

1
preg_match("/(70|96)./",$visitor) 

また、おそらく次のようになります。

preg_match("/^(70|96)\./",$visitor) 

またはあなたにも1.2.96.4および1.2.3.70などをブロックすることがあります。

3

これは、基本的にOR演算子である正規表現の「alternation」構文を使用して実現できます。 "^"を使用して文字列の先頭に式を固定する必要があります。これはIPの最初のオクテットと一致することを保証し、正規表現のワイルドカードであるドットをエスケープするバックスラッシュです。

このスニペットは、あなたのために働く必要があります。

<?php 
$referrer = $_SERVER['HTTP_REFERER']; 
$visitor = $_SERVER['REMOTE_ADDR']; 
if ((preg_match("/referrer-domain.com/",$referrer)) && (!preg_match("/^(?:70|96)\./",$visitor))){ 
    echo "<meta http-equiv='refresh' content='0;url=http://www.new-domain.com'>"; 
} 
?> 

あなたはまた、すなわち、単にPHPのヘッダ()関数の代わりに、メタリフレッシュを使用して検討する必要があります。

if ((preg_match("/referrer-domain.com/",$referrer)) && (!preg_match("/^(?:70|96)\./",$visitor))){ 
    header("Location: http://www.new-domain.com"); 
} 
+0

など、sprintfの使用が重要である理由のために、部分的なIPアドレスを持つために注意すべきいくつかの他のもののためのメタリフレッシュの良い点をhttp://php.net/manual/en/function.ip2long.phpをチェックしてください。 – ceejayoz

1

代替と間違いなくより良い解決策は、PHPのip2long()関数を使用することです。

これは、ドット付きIPアドレスを整数に変換します。>と<ロジックを使用して比較することができます。

例えば、

ipstart = sprintf("%u", ip2long('70.0.0.0')); 
ipend = sprintf("%u", ip2long('70.255.255.255')); 
$visitor = sprintf("%u", ip2long($visitor = $_SERVER['REMOTE_ADDR'])); 
$referrer = sprintf("%u", ip2long($visitor = $_SERVER['HTTP_REFERER'])); 

if (($visitor < $ipstart | $visitor < $ipend) | ($referer < $ipstart | $referer < $ipend)){ 
    header('location: http://www.new-domain.com'); 
} 

$ ipstartと$ IPENDは、有効なIPの配列だった場合は、別のIP範囲の任意の数を確認するためにそれらを反復可能性の範囲です。

関連する問題