2017-04-24 1 views
0

아래의 PHP 코드를 사용하여 위치를 설정하기 위해 사용자의 IP 주소를 가져옵니다. 그것은 우리의 품질 보증 환경에서 작동하지만 우리의 환경에서, 그것은 항상 127.0.0.1로 IP를 반환합니다. 내가 거기에 두 가지 환경 사이에 다른 아파치/Nginx (우리 모두를 사용) 구성해야합니다 같아요하지만 어떤 구성이 (?)에 영향을 미칠지 모르겠다. 두 환경의 유일한 차이점은 RackSpace 클라우드에 호스팅 된 환경에서 트래픽이로드 밸런서에 먼저 도달한다는 것입니다. 그러나 이것이 IP를 localhost로 변경하는 이유를 알지 못해서 그게 사실이라고 믿지 마라. 내가 틀렸다면 나에게 정정해라.PHP visitorIP() 반환 로컬 호스트 주소

function urlIsPublic($ip_list) { 
    $ips = explode(',', $ip_list); 
    foreach($ips as $ip) { 
     $ip = trim($ip); 
     if(filter_var($ip, 
       FILTER_VALIDATE_IP, 
       FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) 
      !== false) { 
      return $ip; 
     } 
    } 
    return false; 
} 

당신에게 :

<?php 

$userIp = visitorIP(); 
$ipquad = explode(".", $userIp); 
$ipnum = 16777216 * $ipquad[0] + 65536 * $ipquad[1] + 256 * $ipquad[2] + $ipquad[3]; 
var_dump('IP:- '.$userIp); 
var_dump($ipquad); 
var_dump('ipnum:- '.$ipnum); 
die; 

function visitorIP() { 

    $ip = $_SERVER['REMOTE_ADDR']; 

    if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && urlIsPublic($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
     $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; 
    } 

    /* Check for Akamai custom header */ 
    if(isset($_SERVER['HTTP_TRUE_CLIENT_IP'])){ 
     $ip = $_SERVER['HTTP_TRUE_CLIENT_IP']; 
    } 


    if (!(urlIsPublic(trim($ip)))) { 
     if(defined('IP')) { 
      return IP; 
     } 
    } 

    return trim($ip); 
} 

function urlIsPublic($ip) { 
    if(filter_var($ip, 
          FILTER_VALIDATE_IP, 
          FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) 
       !== false) { 
     return true; 
    } 
    return false; 

} 

?> 

위해서 var_dump의 출력 ($이 _ 서버)는 쉼표로 구분 된 목록입니다 때문에

array(29) { ["APPLICATION_ENV"]=> string(10) "production" ["HTTP_HOST"]=> string(19) "www.example.com" ["HTTP_X_FORWARDED_FOR"]=> string(32) "<MY_PUBLIC_IP>, 192.168.200.154" ["HTTP_CONNECTION"]=> string(5) "close" ["HTTP_CACHE_CONTROL"]=> string(9) "max-age=0" ["HTTP_UPGRADE_INSECURE_REQUESTS"]=> string(1) "1" ["HTTP_USER_AGENT"]=> string(109) "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" ["HTTP_ACCEPT"]=> string(74) "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" ["HTTP_ACCEPT_ENCODING"]=> string(19) "gzip, deflate, sdch" ["HTTP_ACCEPT_LANGUAGE"]=> string(26) "en-GB,en-US;q=0.8,en;q=0.6" ["PATH"]=> string(29) "/sbin:/usr/sbin:/bin:/usr/bin" ["SERVER_SIGNATURE"]=> string(80) " 
Apache/2.2.15 (CentOS) Server at www.example.com Port 80 
" ["SERVER_SOFTWARE"]=> string(22) "Apache/2.2.15 (CentOS)" ["SERVER_NAME"]=> string(19) "www.example.com" ["SERVER_ADDR"]=> string(9) "127.0.0.1" ["SERVER_PORT"]=> string(2) "80" ["REMOTE_ADDR"]=> string(9) "127.0.0.1" ["DOCUMENT_ROOT"]=> string(37) "/var/www/vhosts/example/httpdocs" ["SERVER_ADMIN"]=> string(14) "[email protected]" ["SCRIPT_FILENAME"]=> string(48) "/var/www/vhosts/example/httpdocs/ipinfo.php" ["REMOTE_PORT"]=> string(5) "45532" ["GATEWAY_INTERFACE"]=> string(7) "CGI/1.1" ["SERVER_PROTOCOL"]=> string(8) "HTTP/1.0" ["REQUEST_METHOD"]=> string(3) "GET" ["QUERY_STRING"]=> string(0) "" ["REQUEST_URI"]=> string(11) "/ipinfo.php" ["SCRIPT_NAME"]=> string(11) "/ipinfo.php" ["PHP_SELF"]=> string(11) "/ipinfo.php" ["REQUEST_TIME"]=> int(1493132187) } 
+1

Prod에서 약간 뚜렷한 소리가 들리지만 $ _SERVER의 내용을 확인하여 실제로 확인한 내용이 있는지 확인하십시오.로드 균형 조정기가 다른 이름으로 보낼 수도 있고 때로는 ... – Brian

+1

테스트 목적으로, 당신이 할 수있는'var_dump ($ _ SERVER)'및 귀하의 IP가 거기에 어디 에나 나열되어 있는지 확인하십시오. 다른 변수를 검사해야하거나로드 밸런서가 IP를 다시 쓸 수 있습니다. – aynber

+1

'HTTP_X_FORWARDED_FOR'는 쉼표로 구분 된 목록이거나 프록시 중 하나가 전달하지 않을 수 있습니다. –

답변

1

, 당신은 각각의 IP를 확인해야 ... 다음과 같습니다 다음과 같이 사용하면 나중에 $ip이 거짓인지 확인합니다.

if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
    $ip = urlIsPublic($_SERVER['HTTP_X_FORWARDED_FOR']); 
}