Php 如果是内部IP地址,则重定向用户

Php 如果是内部IP地址,则重定向用户,php,ip-address,Php,Ip Address,我不熟悉PHP,但我需要创建一个简单的页面来临时重定向内部用户,直到生产问题得到解决 如果用户的IP地址以“10.”、“192.”或“172.”开头,那么我需要将它们重定向到另一台服务器。如果用户的IP地址不符合此标准,则我需要显示一条消息,告知用户站点已停止维护 有人能帮我吗?您可以使用查看用户的地址()是否以10.、192.或172.开头。: if(preg_match('/^(10|192|172)\./', $_SERVER['REMOTE_ADDR'])) { header('

我不熟悉PHP,但我需要创建一个简单的页面来临时重定向内部用户,直到生产问题得到解决

如果用户的IP地址以
“10.”
“192.”
“172.”
开头,那么我需要将它们重定向到另一台服务器。如果用户的IP地址不符合此标准,则我需要显示一条消息,告知用户站点已停止维护

有人能帮我吗?

您可以使用查看用户的地址()是否以
10.
192.
172.开头。

if(preg_match('/^(10|192|172)\./', $_SERVER['REMOTE_ADDR']))
{
    header('Location: http://example.com');
    die;
}
echo 'Site down for maintenance.';
您可以使用查看用户地址()是否以
10.
192.
172.
开头:

if(preg_match('/^(10|192|172)\./', $_SERVER['REMOTE_ADDR']))
{
    header('Location: http://example.com');
    die;
}
echo 'Site down for maintenance.';
好吧,你可以这样做:

$ip = $_SERVER['REMOTE_ADDR']; //get IP address
$toRedirect = array(10,192,172); 
$parts = explode('.', $ip); 
$id = $parts[0];
if(in_array($id, $toRedirect)) { 
  //do redirect
}
你可以这样做:

$ip = $_SERVER['REMOTE_ADDR']; //get IP address
$toRedirect = array(10,192,172); 
$parts = explode('.', $ip); 
$id = $parts[0];
if(in_array($id, $toRedirect)) { 
  //do redirect
}

您无法通过IPv4地址的第一个八位组可靠地标识本地ip地址。幸运的是,PHP为我们解决了所有这些问题。我知道OP只询问IPv4,但这个解决方案也包括IPv6和保留地址

/**
 * Function returns true if IP Address is identified as private or reserved
 *
 * Uses REMOTE_ADDR, a reliable source as TCP handshake is required, most others can be spoofed
 *
 * FILTER_FLAG_NO_PRIV_RANGE:
 *     Fails validation for the following private IPv4 ranges: 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16.
 *     Fails validation for the IPv6 addresses starting with FD or FC.
 *
 * FILTER_FLAG_NO_RES_RANGE:
 *     Fails validation for the following reserved IPv4 ranges: 0.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24 and 224.0.0.0/4.
 *     This flag does not apply to IPv6 addresses.
 */
function isPrivateIp()
{
    return !filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
}

/*Using function to get OP desired result*/
if (isPrivateIp() === true) {
    $server = 'http://example.com';
    //redirect to another server
    header("Location: $server");
} else {
    //Show maintenance message
    echo 'The site is down for maintenance.';
}
exit;

您无法通过IPv4地址的第一个八位组可靠地标识本地ip地址。幸运的是,PHP为我们解决了所有这些问题。我知道OP只询问IPv4,但这个解决方案也包括IPv6和保留地址

/**
 * Function returns true if IP Address is identified as private or reserved
 *
 * Uses REMOTE_ADDR, a reliable source as TCP handshake is required, most others can be spoofed
 *
 * FILTER_FLAG_NO_PRIV_RANGE:
 *     Fails validation for the following private IPv4 ranges: 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16.
 *     Fails validation for the IPv6 addresses starting with FD or FC.
 *
 * FILTER_FLAG_NO_RES_RANGE:
 *     Fails validation for the following reserved IPv4 ranges: 0.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24 and 224.0.0.0/4.
 *     This flag does not apply to IPv6 addresses.
 */
function isPrivateIp()
{
    return !filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
}

/*Using function to get OP desired result*/
if (isPrivateIp() === true) {
    $server = 'http://example.com';
    //redirect to another server
    header("Location: $server");
} else {
    //Show maintenance message
    echo 'The site is down for maintenance.';
}
exit;

作为记录,并非所有以
192.
172.
开头的地址都是内部/私有的。@webbiedave虽然我知道这是真的,但我不知道确切的规则,这是不光彩的,因为我的主要工作职责是维护IP网络-您是否有链接到权威来源,了解这些规则实际上是什么?我看到/听到过相互矛盾的事情,而且我读过的所有官方文件实际上都没有明确规定为内部使用保留的地址范围,尽管我确信一定有一些。例如,我知道人们倾向于使用
192.168.0.0/16
作为内部地址,但
192.
实际上是一个C类地址,因此规则应该更严格。要从webbiedave展开,它是
192.168.*.*.
172.16.0.0-172.31.255.255
,用于“哪些数字是私有查询”参考。对于OP,也请注意,到目前为止,所有的答案都对您的问题是正确的,但对“私有/内部ip”是不正确的。最后,这不是在Web服务器中处理得更好,而不是在php中处理吗?请注意,并非所有以
192.
172.
开头的地址都是内部/私有的。@webbiedave虽然我知道这是真的,我不知道确切的规则,这是可耻的,因为我的主要工作职责是维护IP网络——你有没有链接到权威来源,了解这些规则到底是什么?我看到/听到过相互矛盾的事情,而且我读过的所有官方文件实际上都没有明确规定为内部使用保留的地址范围,尽管我确信一定有一些。例如,我知道人们倾向于使用
192.168.0.0/16
作为内部地址,但
192.
实际上是一个C类地址,因此规则应该更严格。要从webbiedave展开,它是
192.168.*.*.
172.16.0.0-172.31.255.255
,用于“哪些数字是私有查询”参考。对于OP,也请注意,到目前为止,所有答案都对您的问题是正确的,但对“私有/内部ip”是不正确的。最后,这不是在Web服务器而不是php中处理得更好吗?它的$u服务器['REMOTE\u ADDR']不是$u服务器['REMOTE\u ADDR']。它的$u服务器['REMOTE\u ADDR']不是$u服务器['REMOTE\u ADDRESS']。如果用户正在导航到使用公共DNS的站点,这不会返回用户的公共IP吗?如果用户正在导航到使用公共DNS的站点,这不会返回用户的公共IP吗?