2017-04-24 22 views
0

私は自分の位置を設定するために、以下のPHPコードを使ってユーザのIPアドレスを取得しています。私たちのQA環境で動作しますが、私たちの環境では常にIPを127.0.0.1として返します。私は2つの環境の間でいくつかの異なるApache/Nginx(私たちは両方を使用する)構成がなければならないと思うが、どの構成がこれに影響を与えるのかわからない(?)。 2つの環境の唯一の違いは、RackSpaceクラウドでホストされているわれわれのプロダクト環境でトラフィックが最初にロードバランサに当たるということですが、なぜこれがIPをlocalhostに変更するのかわかりませんそれが事実だとは思わない - 私が間違っているなら私を修正してください。localhostのアドレスを返すPHP visitorIP()

<?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の出力($ _ SERVER)以下である...

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つがそれを転送していないかもしれません。 –

答えて

1

それはカンマ区切りリストですので、あなたは、個々のIPをチェックする必要があります。

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; 
} 

あなたはこのように使用して、後で$ipが偽であるかどうかを確認してください:

if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
    $ip = urlIsPublic($_SERVER['HTTP_X_FORWARDED_FOR']); 
} 
関連する問題