Перенаправить пользователя, если внутренний IP-адрес - PullRequest
1 голос
/ 19 января 2012

Я не знаком с PHP, но мне нужно создать простую страницу для временного перенаправления внутренних пользователей до устранения производственной проблемы.

Если IP-адрес пользователя начинается с "10.", "192.",или "172." тогда мне нужно перенаправить их на другой сервер.Если IP-адрес пользователя не соответствует этим критериям, мне нужно отобразить сообщение о том, что сайт закрыт на техническое обслуживание.

Может ли кто-нибудь помочь мне с этим?

Ответы [ 5 ]

6 голосов
/ 19 января 2012

Вы можете использовать preg_match(), чтобы увидеть, начинается ли адрес пользователя ($_SERVER['REMOTE_ADDR']) с 10., 192. или 172.:

if(preg_match('/^(10|192|172)\./', $_SERVER['REMOTE_ADDR']))
{
    header('Location: http://example.com');
    die;
}
echo 'Site down for maintenance.';
2 голосов
/ 19 января 2012
$chunks = explode('.', $_SERVER['REMOTE_ADDR']);
$whitelist = array(10, 192, 172);
$server = "http://example.com";
if(in_array($chunks[0], $whitelist))
{
    //redirect to another server
    header("Location: " . $server);
    die();
}
else
{
    //Show maintenance message
    die("The site is down for maintenance.");
}
1 голос
/ 08 сентября 2016

Вы не можете надежно определить локальный IP-адрес через первый октет IPv4-адреса.К счастью, 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;
0 голосов
/ 19 января 2012

Ну, вы можете сделать это:

$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
}
0 голосов
/ 19 января 2012
<?php

  // Settings
  $toRedirect = array (10, 172, 192);
  $redirectAddress = 'http://wherever.com/';
  $maintenanceMessage = 'The site is down for maintenance';

  // Split the IP address into octets
  list($oct1, $oct2, $oct3, $oct4) = explode('.', $_SERVER['REMOTE_ADDR']);

  // Send local clients to redirect address
  if (in_array($oct1, $toRedirect)) {
    header('HTTP/1.1 307 Temporary Redirect');
    header('Location: '.$redirectAddress);
  }

  // Exit with the maintenance message.
  // We can send this everyone in case the redirect fails
  exit($maintenanceMessage);
...