Вопрос

Какой лучший способ получить IP-адрес в PHP:

getenv('REMOTE_ADDR'); 

или,

$_SERVER['REMOTE_ADDR'];

пожалуйста, скажите мне, в чем разница, если таковая имеется, между этими двумя.

Это было полезно?

Решение

getenv() может использоваться для доступа к любым переменным среды (PHP просто регистрирует REMOTE_ADDR как переменную среды для скрипта), в то время как с помощью $_SERVER вы, очевидно, получаете доступ только к содержимому суперглобального $_SERVER.

Общий подход заключается в использовании $_SERVER для этого, хотя на самом деле это не имеет значения с точки зрения функциональности.

Другие советы

$_SERVER - это встроенная переменная PHP, в то время как getenv() запрашивает значения у среды (вероятно, Apache / IIS).

Лучший способ получить IP-адрес - это;

$ip = (!empty($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : getenv('REMOTE_ADDR');

Но я сомневаюсь, что есть какая-то разница между этими двумя переменными...Хм.

Вероятно, было бы лучше использовать $_SERVER['REMOTE_ADDR'];чтобы предотвратить несовместимость между серверами.

Между этими вызовами нет никакой разницы.Как вы можете видеть Руководство по PHP используйте оба метода в одном и том же примере.Есть некоторые случаи, когда у вас не включены глобальные переменные, такие как $_SERVER, и вы вынуждены использовать getenv().По моему опыту, я никогда не видел сервер с отключенными глобальными переменными.

С $_SERVER['REMOTE_ADDR'] вы непосредственно считываете глобальную переменную, обращаясь к массиву $_SERVER[], который настраивается при выполнении удаленного запроса:

$_СЕРВЕР представляет собой массив, содержащий такую информацию, как заголовки, пути и расположения скриптов.Записи в этом массиве создаются веб-сервером.Нет никакой гарантии, что каждый веб-сервер предоставит любой из этих;серверы могут пропускать некоторые из них или предоставлять другие, не перечисленные здесь.Тем не менее, большое количество этих переменных учтено в спецификации CGI 1.1, так что вы должны быть в состоянии ожидать их.

Функция getenv() обращается к любой переменной окружения, чтобы получить соответствующее значение!

В обоих случаях вы получаете доступ к одному и тому же значению и одной и той же переменной ...но $_SERVER - это встроенная в PHP суперглобальная переменная, вместо этого getenv() получает значение переменной, определенной в текущей среде!

Я думаю, что в данном случае использование суперглобальной переменной - лучший способ получить IP-адрес!

Этот пост немного устарел, поэтому я подумал, что хотел бы поделиться тем, как я в настоящее время получаю IP-адрес запроса в своих PHP-скриптах, поскольку изначально этот пост был посвящен лучше способ получить IP-адрес запроса.Это лучший способ, хотя и не один из вариантов, приведенных в исходном сообщении.

Этот подход использует небольшую библиотеку функций для удобства переносимости.

// Function to sanitize IP string
function sanitize_ip($string){
  $string = trim($string); 
  $string = strip_tags($string);
  $string = htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
  $string = str_replace('\n', '', $string);
  $string = trim($string); 
  return $string;
}

// Function to evaluate HTTP headers for IP
function evaluate_ip(){
  $ip_keys =
    array(
      'HTTP_CF_CONNECTING_IP',  'HTTP_CLIENT_IP',            'HTTP_X_FORWARDED_FOR',
      'HTTP_X_FORWARDED',       'HTTP_X_CLUSTER_CLIENT_IP',  'HTTP_X_REAL_IP',
      'HTTP_X_COMING_FROM',     'HTTP_PROXY_CONNECTION',     'HTTP_FORWARDED_FOR',
      'HTTP_FORWARDED',         'HTTP_COMING_FROM',          'HTTP_VIA',
      'REMOTE_ADDR'
    );
  foreach ($ip_keys as $key){
    if (array_key_exists($key, $_SERVER) === true){
      foreach (explode(',', $_SERVER[$key]) as $ip){
        $ip = trim($ip);
        $ip = normalize_ip($ip);
        if (validate_ip($ip)) return $ip;
      }
    }
  }
  // Build error response HTML
  $msg =
    '<div style="width:100%; font-family:serif; font-size:24px; line-height:28px; color:#cc0000; font-weight:bold; text-align:center; padding:10px;">
      ERROR:&nbsp;<span style="color:#ffc107">Invalid IP Address</span>
    </div>';
  echo $msg;
  exit;
}

// Function to normalize IPv4 and IPv6 addresses with port
function normalize_ip($ip){
  // IPv4 with port (e.g., 123.123.123.123:80)
  if (strpos($ip, ':') !== false && substr_count($ip, '.') == 3 && strpos($ip, '[') === false){
    $ip = explode(':', $ip);
    $ip = $ip[0];
  }
  // IPv6 with port (e.g., [::1]:80)
  else {
    $ip = explode(']', $ip);
    $ip = ltrim($ip[0], '[');
  }
  return $ip;
}

// Function to validate IP address
function validate_ip($ip){
  $options  = FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE;
  $filtered = filter_var($ip, FILTER_VALIDATE_IP, $options);
  if (!$filtered || empty($filtered)){
    if (preg_match("/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/", $ip)){
      return $ip; // IPv4
    }
    elseif (preg_match("/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/", $ip)){
      return $ip; // IPv6
    }
    // Build error response HTML
    $msg =
      '<div style="width:100%; font-family:serif; font-size:24px; line-height:28px; color:#cc0000; font-weight:bold; text-align:center; padding:10px;">
        ERROR:&nbsp;<span style="color:#ffc107">Invalid IP Address</span>
      </div>';
    echo $msg;
    exit;
  }
  return $filtered;
}

function get_ip(){
  $ip = evaluate_ip();
  if (preg_match('/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/', $ip, $ip_match)){
    $ip = $ip_match[1];
  }
  return sanitize_ip($ip);
}


// To Use
$ip = get_ip();

//

Надеюсь, это поможет кому-то сейчас, в 2018 году!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top