PHP プログラミングのプロセスでは、クライアント IP を取得することが非常に一般的な要件です。クライアント IP の取得は簡単ではなく、エラーが発生しやすいです。今日はよくある間違いについて説明します。
間違い 1: $_SERVER['REMOTE_ADDR'] の使用
初心者は、この一般的な変数を使用してクライアント IP アドレスを取得できます:
$ip = $_SERVER['REMOTE_ADDR'];
このメソッドは実際にクライアント IP です。を取得できますが、クライアントがプロキシ サーバー経由でアクセスする場合、この変数はクライアントの実際の IP ではなく、プロキシ サーバーの IP アドレスを返します。
エラー 2: $_SERVER['REMOTE_ADDR'] の再利用
もう 1 つの間違いは、$_SERVER['REMOTE_ADDR'] 変数を再利用すること、つまり、変数を複数回取得することです。リクエストの処理時に $_SERVER['REMOTE_ADDR'] が設定されるため、このメソッドは通常、同じ IP を返します。
$ip = $_SERVER['REMOTE_ADDR']; $ip2 = $_SERVER['REMOTE_ADDR'];
エラー 3: 間違ったヘッダー情報の取得
次のアドレスにアクセスすると、リクエスト ヘッダー情報を表示できます:
http://httpbin.org/headers
多くのチュートリアルでは、HTTP_X_FORWARDED_FOR または HTTP_CLIENT_IP を使用してクライアント IP アドレスを取得します。ただし、プロキシ サーバーが異なれば配信に異なる識別子が使用される可能性があるため、このアプローチは最適ではありません。
これには、クライアント IP を確実に取得するために、サーバー構成ファイルで正しいプロキシ サーバー IP アドレスを使用する必要があります。具体的な方法については、以下のコードを参照してください。
if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; }
エラー 4: プロキシ サーバーの後にプロトコル エラーが発生します
プロキシ サーバーの背後で作業していて、PHP で HTTP を検出したい場合は、プロトコルhttp または https の場合は、次のコードを使用できます:
if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) { $protocol = 'https://'; } else { $protocol = 'http://'; }
エラー 5: IIS サーバーでの IP 取得エラー
IIS サーバーで作業している場合は、$_SERVER['REMOTE_ADDR'] を使用してください。 IP アドレスを入力すると、次のエラーが発生する場合があります:
$_SERVER['REMOTE_ADDR'] returns 127.0.0.1 in IIS for local requests
この問題を解決するには多くの方法がありますが、その 1 つは次のコードを使用することです:
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $ip = array_shift($ip); } else { $ip = $_SERVER['REMOTE_ADDR']; }
概要
正解 クライアント IP アドレスを正確に取得することは頭の痛い問題ですが、機密データを扱う場合には非常に重要です。上記のエラーは、日常的に発生する可能性のある問題のほんの一部にすぎませんが、正しい方法を習得し、サーバー構成ファイルを使用することで、これらの問題を回避できます。
以上がPHPでクライアントIPを取得する際のエラーを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。