-1

この質問が何度も聞かれたことは知っていますが、私の側からは正しい答えが得られませんでした。ここでは、次のコードを使用して、ホストされている Web サイトからエンド ユーザー システムの IP アドレスを取得しています。

function ipCheck() {
    if (getenv('HTTP_CLIENT_IP')) {
        $ip = getenv('HTTP_CLIENT_IP');
    }
    elseif (getenv('HTTP_X_FORWARDED_FOR')) {
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    }
    elseif (getenv('HTTP_X_FORWARDED')) {
        $ip = getenv('HTTP_X_FORWARDED');
    }
    elseif (getenv('HTTP_FORWARDED_FOR')) {
        $ip = getenv('HTTP_FORWARDED_FOR');
    }
    elseif (getenv('HTTP_FORWARDED')) {
        $ip = getenv('HTTP_FORWARDED');
    }
    else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
echo ipCheck();

私のローカル ネットワークでは、このコードは正常に動作しています。それは私のローカル IP 192.168.xxx.xxx を正しく与えました。しかし、私のウェブサイトでこのコードを実行すると、別の IP アドレスが与えられました。

4

2 に答える 2

2

正常に動作しています。提供される IP アドレスが外部 IP アドレスになります (Google にアクセスして「私の IP アドレスは何ですか」と検索すると、外部 IP が表示されるので、必要に応じてコードが正しいことを確認できます)。

ローカル ネットワークの外部でホストされているサーバーで使用すると、192.168.xx のローカル IP アドレスは表示されません。これは、その情報が要求で提供されないためです。その IP アドレスは、ローカル ネットワークでのみ有効です。

于 2013-09-17T13:41:31.330 に答える
1

IPv4ネットワークでの通常のネットワーク アドレス変換のため、これを行うことはできません。つまり、NAT の背後にあるすべての IP アドレスが単一の IP アドレスとして表示され (それがゲートウェイ アドレスになります)、したがって、ゲートウェイ アドレスしか取得できなくなります。

これに加えて、実際のクライアント (つまり、彼のゲートウェイ) のアドレスを隠したり変更したりできるProxy Serversがあります。したがって、一般的に、あなたの質問には否定的な答えがあります。つまり、それは不可能です。

また、HTTP_X_FORWARDED_FORは必須ではないHTTP リクエスト ヘッダーであるため、送信してもしなくてもかまいません。何でもかまいません (Firefox の LiveHTTPHeaders のようなものを使用すると、このヘッダーで「Hello, world!」を送信でき、スクリプトはそれを確認します)。

于 2013-09-17T13:42:43.040 に答える