ホームページ  >  記事  >  バックエンド開発  >  PHPは実際のIPを取得できません

PHPは実際のIPを取得できません

王林
王林オリジナル
2019-09-29 17:46:244245ブラウズ

PHPは実際のIPを取得できません

#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 でも効果的です。

2. REMOTE_ADDR について

この変数は、「直接送信元」の 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。