PHP: проверка ip адреса на принадлежность к указанным сетям

Как то раз, у меня появилась необходимость выдавать разный контент для клиентов из разных сетей. И мы, с моим многоуважаемым другом набросали для этой цели вот такой небольшой скриптик на php. Области применения можете придумывать сами. :)

[ тут был кривой и нерабочий код.. :) ]
UPDATE:
И вот недавно выяснилось, что скрипт этот работает криво. Короче говоря, я немного поковырялся в нете, и нашёл более подходящий вариант, который я просто немного переделал:

$netlist = explode("\n", file_get_contents($_SERVER['DOCUMENT_ROOT'].'/networks.txt')); // для удобства, сети размещены в файле столбиком.

function checkip($ip, $nets) {
        foreach($nets as $network) {
                if(!empty($network)){
                $ip_arr = explode ( '/' , $network );
                $network_long = ip2long ( $ip_arr [ 0 ]);

                $x = ip2long ( $ip_arr [ 1 ]);
                $mask = long2ip ( $x ) == $ip_arr [ 1 ] ? $x : 0xffffffff << ( 32 - $ip_arr [ 1 ]);
                $ip_long = ip2long ( $ip );
                if(($ip_long & $mask ) == ( $network_long & $mask )){
                        return 1;
                }
                }
        }
}

и далее уже можно выполнять проверку, и редиректить клиентов туда, куда нужно, например, вот таким образом:

if(checkip($_SERVER['REMOTE_ADDR'], $netlist )){
	header('location: http://int.site.com'.$_SERVER['REQUEST_URI']);
} else {
	header('location: http://ext.site.com'.$_SERVER['REQUEST_URI']);
}

Add a comment »2 комментария to this article

  1. IP: 37.60.221.27
    Диапазон: 91.109.152.0/255

    При проверке попадает в этот диапазон, неужели это так?

  2. max

© eXUnity TEAM 2004 - 2017