PHP를 사용하여 클라이언트 IP 주소 얻기 [중복]
이 질문에는 이미 답변이 있습니다.
내 웹 사이트를 사용하는 클라이언트 IP 주소를 얻고 싶습니다. PHP $_SERVER
슈퍼 글로벌을 사용하고 있습니다 :
$_SERVER['REMOTE_ADDR'];
그러나 이것을 사용하여 올바른 IP 주소를 제공 할 수 없다는 것을 알았습니다. 내 IP 주소를 가져 와서 내 IP 주소와 다른 것을 확인하고 다음과 같은 일부 웹 사이트에서 내 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;
}
}
}
}
}
내부 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;
}
참고 URL : https://stackoverflow.com/questions/15699101/get-the-client-ip-address-using-php
'IT' 카테고리의 다른 글
__getattr__과 __getattribute__의 차이점 이해 (0) | 2020.05.13 |
---|---|
IP 주소에서 위치 얻기 (0) | 2020.05.13 |
GitHub README.md에 비디오를 포함시키는 방법은 무엇입니까? (0) | 2020.05.13 |
잃어버린 초점 대신 키 누르기를 사용하여 녹아웃 JS를 데이터 바인딩 할 수 있습니까? (0) | 2020.05.13 |
Java : Date 생성자가 더 이상 사용되지 않는 이유는 무엇입니까? (0) | 2020.05.13 |