我正在建立一个管理面板。我想阻止某些IP范围。我正在我的localhost wamp服务器上测试这个,但是似乎没有重定向我。
<?php
if($_SERVER['REMOTE_ADDR'] == '127.0.0..*')
header("Location: http://google.com");
else
echo "Hai";
?>
赞赏任何意见。
答案 0 :(得分:4)
足以使用字符串比较
if (strncmp('127.0.0.', $_SERVER['REMOTE_ADDR'], 8) === 0)
header("Location: http://google.com");
else
echo "Hai";
更新:取自inits的评论
假设我想阻止来自此范围的任何IP:192.168.0.1-255。什么是最好的解决方案?感谢。
然后只对该块进行相同的字符串比较
if (strncmp('192.168.0.', $_SERVER['REMOTE_ADDR'], 10) === 0)
header("Location: http://google.com");
else
echo "Hai";
如果要同时针对两个块测试远程地址,您可能会将它们放在一个表达式中。这次我们需要一种不同的方法
if (in_array(substr($_SERVER['REMOTE_ADDR'], 0, strrpos($_SERVER['REMOTE_ADDR'], '.')), array('127.0.0', '192.168.0'))) {
header("Location: http://google.com");
else
echo "Hai";
substr()
- 部分获取IP直到最后.
。我们可以尝试在IP前缀的集合( - &gt;数组)中找到此字符串。
答案 1 :(得分:3)
$ip0 = ip2long("127.0.0.1");
$ip1 = ip2long("127.0.0.254");
$ip = ip2long($_SERVER['REMOTE_ADDR']);
if ($ip0 <= $ip && $ip <= $ip1) {
echo long2ip($ip) . " is inside range " . long2ip($ip0) . "-" . long2ip($ip1);
}
else {
echo long2ip($ip) . " is outside range " . long2ip($ip0) . "-" . long2ip($ip1);
}
答案 2 :(得分:0)
这是一种更好的方法,使用正则表达式:
// returns true for IPs 127.0.0.0-255
if (preg_match("'^127[.]0[.]0[.][0-9]+'",$_SERVER['REMOTE_ADDR']))
{
header("Location: http://google.com");
}
else
{
echo "Hai";
}
编辑:很好,把它带到另一个级别,可能不是最有效,但更容易配置:
$mask = "192.168.1.1-255";
$ip = explode(".",$_SERVER['REMOTE_ADDR']);
$in = 0;
foreach (explode(".",$mask) as $k => $v)
{
if (preg_match("'^([0-9]+)-([0-9]+)$'",$v,$n))
{
if ($ip[$k] >= $n[1] && $ip[$k] <= $n[2]) $in++;
}
elseif (preg_match("'^[0-9]+$'",$v,$n))
{
if ($ip[$k] == $n[0]) $in++;
}
}
if ($in == 4)
{
header("Location: http://google.com");
}
else
{
echo "Hai";
}