web-dev-qa-db-ja.com

HTTP_CLIENT_IPとHTTP_X_FORWARDED_FORの違いは何ですか?

ヘッダーHTTP_X_FORWARDED_FORは、プロキシサーバーによって設定され、プロキシを介してHTTP要求を行っているホストのIPアドレスを識別します。ヘッダーHTTP_CLIENT_IPは同様の目的で設定されます。

  1. 違いは何ですか HTTP_CLIENT_IPおよびHTTP_X_FORWARDED_FOR
  2. なぜ一方が他方と異なる値を持つのでしょうか?
  3. これらのヘッダーの正確な定義に関するリソースはどこにありますか。
60
Ethan Heilman

これらのヘッダーはどちらも公式に標準化されていません。したがって:

  1. What is the difference between HTTP_CLIENT_IP and HTTP_X_FORWARDED_FOR?-言うことは不可能です。異なるプロキシがこれらを実装する場合としない場合があります。実装はプロキシごとに異なる場合がありますが、そうでない場合があります。標準の欠如は疑問符を生み出します。
  2. Why would one have different values than the other?-ポイント1を参照してください。ただし、純粋に実用的な観点から見ると、これらの値が異なるのは、複数のプロキシが関係している場合だけです-X-Forwarded-For:ヘッダーにはClient-IP:ヘッダーには実際のクライアントIPが含まれますが、転送チェーンの完全なトラック。ただし、これは単なる憶測です。
  3. Where can I find resources on the exact definition of these headers.-できません。ポイント1を参照してください。

X-Forwarded-For:ヘッダーに関して ある種の事実上の標準 があるようですが、 それを定義するRFCがないため、これは信頼できません 以下のコメントを参照してください。

補足として、Client-IP:ヘッダーは 'user-defined'ヘッダーであるため、慣例によりX-Client-IP:である必要があります。

58
DaveRandom

この方法でも試すことができます:

if (isset($_SERVER['HTTP_CLIENT_IP'])) {
    $user_ip = $_SERVER['HTTP_CLIENT_IP'];
} else if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $user_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else if (isset($_SERVER['HTTP_X_FORWARDED'])) {
    $user_ip = $_SERVER['HTTP_X_FORWARDED'];
} else if (isset($_SERVER['HTTP_FORWARDED_FOR'])) {
    $user_ip = $_SERVER['HTTP_FORWARDED_FOR'];
} else if (isset($_SERVER['HTTP_FORWARDED'])) {
    $user_ip = $_SERVER['HTTP_FORWARDED'];
} else if (isset($_SERVER['REMOTE_ADDR'])) {
    $user_ip = $_SERVER['REMOTE_ADDR'];
} else {
    $user_ip = null;
}
0
bharat