제 웹사이트를 이용하는 클라이언트 IP 주소를 알고 싶습니다.PHP를 사용하고 있습니다.$_SERVER
superglobal:
$_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;
}
}
}
} }