(1.)我希望允许访问者从某个IP地址范围访问页面(第2段)。很容易添加更多的IP地址到IP地址列表。
我的正则表达式数组是:
$IP_LIST_ACCESS = array(
"/^188\.133\.11\.([1-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-4]))$/"
,"/^188\.133\.14\.([1-9]|[1-9][0-9]|1([0-1][0-9]|2[0-8]))$/"
,"/^127\.0\.0\.1$/"
);
上述阵列的(2.) IP范围为188.133.11.1-188.133.11.254
、188.136.14.1-188.136.14.128
和127.0.0.1
。
下面是我的代码,用来检测错误的ip地址和死:。
$USER_IP_ADDR = $_SERVER['REMOTE_ADDR'];
foreach ($IP_LIST_ACCESS as $IP_ACC_ARRAY)
{
if (!preg_match($IP_ACC_ARRAY, $USER_IP_ADDR))
{
echo '#INVALID IP'; #DEBUG
die;
}
}
(3.)与我的上述代码,总是给INVALID IP
错误(总是检测为错误的IP地址)。
,问题在哪里?
编辑
(4.) --我只想这样做,如果有更好的方法的话,用preg_match就不确切了。
发布于 2012-12-29 10:57:11
更好地使用ip2long内置的regex,它的易用性和更好的性能。
$ip_ranges = array(
array(
'from' => ip2long('188.133.11.1'),
'to' => ip2long('188.133.11.254')
),
array(
'from' => ip2long('188.136.14.1'),
'to' => ip2long('188.136.14.128')
),
array(
'from' => ip2long('127.0.0.0'),
'to' => ip2long('127.255.255.255')
),
);
$USER_IP_ADDR = $_SERVER['REMOTE_ADDR'];
$USER_IP_ADDR_LONG = ip2long($USER_IP_ADDR);
$USER_IS_PERMITTED = false;
foreach ($ip_ranges as $ip_range) {
if ($ip_range['from'] <= $USER_IP_ADDR_LONG && $ip_range['to'] >= $USER_IP_ADDR_LONG) {
$USER_IS_PERMITTED = true;
}
}
if (!$USER_IS_PERMITTED) {
echo '#INVALID IP: ' . $USER_IP_ADDR; #DEBUG
die;
}
发布于 2012-12-29 10:54:53
看看ip2long()
,它从它的Internet标准格式(虚线字符串)表示生成一个IPv4互联网网络地址。
稍后,您可以对其执行范围操作。
发布于 2012-12-29 10:59:39
我很肯定你想要if (preg_match($IP_ACC_ARRAY, $USER_IP_ADDR) === 1)
。现在,如果错误不匹配,则显示错误。这是最快的解决方案,但也许其他答案中提出的ip2long
-based解决方案是最正确的。
https://stackoverflow.com/questions/14080916
复制相似问题