#1. ユーザーの実際の IP アドレスを取得します
public static function getClientIp() { if (getenv('HTTP_CLIENT_IP')) { $ip = getenv('HTTP_CLIENT_IP'); } if (getenv('HTTP_X_REAL_IP')) { $ip = getenv('HTTP_X_REAL_IP'); } elseif (getenv('HTTP_X_FORWARDED_FOR')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); $ips = explode(',', $ip); $ip = $ips[0]; } elseif (getenv('REMOTE_ADDR')) { $ip = getenv('REMOTE_ADDR'); } else { $ip = '0.0.0.0'; } return $ip; }
注:
##$ _SERVER と getenv の違いは、getenv は IIS isapi モードで実行される PHP をサポートしていないことです。 getenv("REMOTE_ADDR") 関数は、Apache では通常、IP アドレスを取得できますが、iis では効果がありません。$_SERVER['REMOTE_ADDR'] 関数は、Apache では訪問者の IP アドレスを正常に取得できますが、iis でも効果的です。
この変数は、「直接送信元」の IP アドレスを取得します。いわゆる「直接送信元」とは、直接リクエストを行う顧客を指します。アドレス終了IP。単一サーバーの場合、この IP は非常に正確であり、偽造することはできません。もちろん、すべてのプログラムが単一サーバーである必要はありません。たとえば、負荷分散が使用されている場合 (負荷分散に haproxy または nginx を使用するなど)、プロセスはクライアント -> 負荷であるため、この IP は転送マシンの IP になります。バランシング -> サーバー。これは、クライアントではなくロード バランサーによって直接アクセスされるサーバーです。
3. HTTP_X_FORWARDED_FOR と HTTP_CLIENT_IP について#負荷分散下では REMOTE_ADDR を直接使用してクライアント IP を取得することができないため、解決する必要がある問題です。したがって、負荷分散側が派生し、クライアント IP を HEAD に追加してサーバーに送信し、サーバーがクライアントの実際の IP を取得できるようにします。もちろん、いわゆる偽造品が作られますが、結局のところ、HEAD プロトコルの固定データを除いて、その他のデータはカスタマイズ可能です。
推奨チュートリアル:
PHP ビデオ チュートリアル以上がPHPは実際のIPを取得できませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。