PHP를 사용하여 클라이언트 IP 주소 가져오기 [복제]

제 웹사이트를 이용하는 클라이언트 IP 주소를 알고 싶습니다.PHP를 사용하고 있습니다.$_SERVERsuperglobal:

$_SERVER['REMOTE_ADDR']; 

그러나, 이것을 사용하면 올바른 IP 주소를 제공할 수 없는 것을 알 수 있습니다.IP 주소를 취득하면, IP 주소와 다른 것을 알 수 있습니다.또, 다음과 같은 Web 사이트에서도 IP 주소를 확인할 수 있습니다.

http://whatismyipaddress.com/ 

PHP 기능을 제공하는 IP 주소를 붙여 넣었지만 이 웹사이트는 이에 대한 결과를 보여주지 않았습니다.이 문제는 어떻게 발생하며 클라이언트의 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'; 



로컬 및 LAN 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;

}
 }
}
} }