Получите IP-адрес клиента, используя PHP

Я хочу получить IP-адрес клиента, который использует мой сайт. Я использую PHP $_SERVER superglobal:

 $_SERVER['REMOTE_ADDR']; 

Но я вижу, что он не может дать правильный IP-адрес, используя это. Я получаю свой IP-адрес и вижу, что он отличается от моего IP-адреса, и я также вижу свой IP-адрес на каком-то веб-сайте, например:

 http://whatismyipaddress.com/ 

Я вставляю IP-адрес, который дает мою функцию PHP, но этот сайт не показывает никаких результатов. Как возникает эта проблема и как я могу получить IP-адрес клиента?

Самый простой способ получить IP-адрес посетителя / клиента – использовать переменные $_SERVER['REMOTE_ADDR'] или $_SERVER['REMOTE_HOST'] .

Однако иногда это не возвращает правильный IP-адрес посетителя, поэтому мы можем использовать некоторые другие переменные сервера для получения IP-адреса.

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

getenv () используется для получения значения переменной среды в PHP.

 // Function to get the client IP address function get_client_ip() { $ipaddress = ''; if (getenv('HTTP_CLIENT_IP')) $ipaddress = getenv('HTTP_CLIENT_IP'); else if(getenv('HTTP_X_FORWARDED_FOR')) $ipaddress = getenv('HTTP_X_FORWARDED_FOR'); else if(getenv('HTTP_X_FORWARDED')) $ipaddress = getenv('HTTP_X_FORWARDED'); else if(getenv('HTTP_FORWARDED_FOR')) $ipaddress = getenv('HTTP_FORWARDED_FOR'); else if(getenv('HTTP_FORWARDED')) $ipaddress = getenv('HTTP_FORWARDED'); else if(getenv('REMOTE_ADDR')) $ipaddress = getenv('REMOTE_ADDR'); else $ipaddress = 'UNKNOWN'; return $ipaddress; } 

$ _SERVER – это массив, содержащий серверные переменные, созданные веб-сервером.

 // Function to get the client IP address function get_client_ip() { $ipaddress = ''; if (isset($_SERVER['HTTP_CLIENT_IP'])) $ipaddress = $_SERVER['HTTP_CLIENT_IP']; else if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR']; else if(isset($_SERVER['HTTP_X_FORWARDED'])) $ipaddress = $_SERVER['HTTP_X_FORWARDED']; else if(isset($_SERVER['HTTP_FORWARDED_FOR'])) $ipaddress = $_SERVER['HTTP_FORWARDED_FOR']; else if(isset($_SERVER['HTTP_FORWARDED'])) $ipaddress = $_SERVER['HTTP_FORWARDED']; else if(isset($_SERVER['REMOTE_ADDR'])) $ipaddress = $_SERVER['REMOTE_ADDR']; else $ipaddress = 'UNKNOWN'; return $ipaddress; } 

В PHP 5.3 или выше вы можете сделать это следующим образом:

 $ip = getenv('HTTP_CLIENT_IP')?: getenv('HTTP_X_FORWARDED_FOR')?: getenv('HTTP_X_FORWARDED')?: getenv('HTTP_FORWARDED_FOR')?: getenv('HTTP_FORWARDED')?: getenv('REMOTE_ADDR'); 
  $ipaddress = ''; if ($_SERVER['HTTP_CLIENT_IP'] != '127.0.0.1') $ipaddress = $_SERVER['HTTP_CLIENT_IP']; else if ($_SERVER['HTTP_X_FORWARDED_FOR'] != '127.0.0.1') $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR']; else if ($_SERVER['HTTP_X_FORWARDED'] != '127.0.0.1') $ipaddress = $_SERVER['HTTP_X_FORWARDED']; else if ($_SERVER['HTTP_FORWARDED_FOR'] != '127.0.0.1') $ipaddress = $_SERVER['HTTP_FORWARDED_FOR']; else if ($_SERVER['HTTP_FORWARDED'] != '127.0.0.1') $ipaddress = $_SERVER['HTTP_FORWARDED']; else if ($_SERVER['REMOTE_ADDR'] != '127.0.0.1') $ipaddress = $_SERVER['REMOTE_ADDR']; else $ipaddress = 'UNKNOWN'; 

Вот функция получения IP-адреса с использованием фильтра для локальных и локальных IP-адресов:

 function get_IP_address() { foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key){ if (array_key_exists($key, $_SERVER) === true){ foreach (explode(',', $_SERVER[$key]) as $IPaddress){ $IPaddress = trim($IPaddress); // Just to be safe if (filter_var($IPaddress, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) { return $IPaddress; } } } } } 

Q

Он также отлично работает для внутренних IP-адресов:

  function get_client_ip() { $ipaddress = ''; if (getenv('HTTP_CLIENT_IP')) $ipaddress = getenv('HTTP_CLIENT_IP'); else if(getenv('HTTP_X_FORWARDED_FOR')) $ipaddress = getenv('HTTP_X_FORWARDED_FOR'); else if(getenv('HTTP_X_FORWARDED')) $ipaddress = getenv('HTTP_X_FORWARDED'); else if(getenv('HTTP_FORWARDED_FOR')) $ipaddress = getenv('HTTP_FORWARDED_FOR'); else if(getenv('HTTP_FORWARDED')) $ipaddress = getenv('HTTP_FORWARDED'); else if(getenv('REMOTE_ADDR')) $ipaddress = getenv('REMOTE_ADDR'); else $ipaddress = 'UNKNOWN'; return $ipaddress; }