我正在使用preg_match来匹配引用网址AND和IP块。如何告诉我的代码查找引用,如果匹配则检查多个IP块?即:70.x.x.x或96.x.x.x
到目前为止,这是我的代码(适用于一个IP块“70.x.x.x”)
<?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'>";
}
?>
我知道这是一个简单的问题,今天只是放了一个脑屁。
答案 0 :(得分:3)
您可以使用正则表达式“交替”语法来实现这一点,该语法基本上是一个OR运算符。您还需要使用“^”将表达式锚定到字符串的开头,这将确保您匹配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的header()函数而不是元刷新,即:
if ((preg_match("/referrer-domain.com/",$referrer)) && (!preg_match("/^(?:70|96)\./",$visitor))){
header("Location: http://www.new-domain.com");
}
答案 1 :(得分:1)
preg_match("/(70|96)./",$visitor)
它也应该是:
preg_match("/^(70|96)\./",$visitor)
或者你也会阻止1.2.96.4和1.2.3.70等。
答案 2 :(得分:1)
另一种可以说是更好的解决方案是使用php的ip2long()函数。
将虚线IP地址转换为整数,您可以使用&gt;进行比较。和&lt;逻辑。
例如
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范围。
查看http://php.net/manual/en/function.ip2long.php了解sprintf使用的重要性,以及其他一些需要注意的部分IP地址等等。