web-dev-qa-db-ja.com

PHPでサーバーのIPアドレスを識別する方法

PHPでサーバーのIPアドレスを特定するにはどうすればよいですか?

105
pooja

サーバーIPの場合:

$_SERVER['SERVER_ADDR'];

そしてこれは港のために

$_SERVER['SERVER_PORT'];
164
CloudyMarble

PHPバージョン5.3以降を使用している場合、次のことができます。

$Host= gethostname();
$ip = gethostbyname($Host);

これは、Webサーバー経由ではなく、スタンドアロンスクリプトを実行している場合に有効です。

90
John K

例えば:

$_SERVER['SERVER_ADDR']

iISを使用している場合:

$_SERVER['LOCAL_ADDR']
19
Flask

このページにアクセスして、自分に接続しているリモートマシンのIPアドレスではなく、自分のIPアドレスを取得する方法を探しました。

これはWindowsマシンでは機能しません。

しかし、誰かが私が探していたものを検索する場合:

#! /usr/bin/php
<?php
$my_current_ip=exec("ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'");
echo $my_current_ip;

LinuxおよびOS XでローカルマシンのプライマリIPアドレスを取得する方法は?

11
Dom

最も多く投票された回答はどちらも、サーバーのパブリックアドレスを確実に返しません。通常、$_SERVER['SERVER_ADDR']は正しいですが、VPN経由でサーバーにアクセスしている場合は、パブリックアドレスではなく内部ネットワークアドレスを返す可能性が高く、同じネットワーク上にない場合でも、一部の構成は単純に空白になるか、他の構成になります指定された値。

同様に、DNS(内部構成または外部レコード)とサーバーのホスト名設定の両方に依存してサーバーのIPアドレスを推定するため、$Host= gethostname(); $ip = gethostbyname($Host);が正しい値を返さないシナリオがあります。これらの手順は両方とも潜在的に欠陥があります。たとえば、サーバーのホスト名がドメイン名(つまり、HOSTNAME=yahoo.com)のようにフォーマットされている場合、(少なくとも私のphp5.4/Centos6のセットアップでは)gethostbynameは、ローカルサーバーではなくYahoo.comのアドレスの検索に直接スキップします。

さらに、gethostbynameはパブリックDNSレコードにフォールバックするため、未公開または不正なパブリックDNSレコードでテストサーバーを使用します(たとえば、localhostまたはIPアドレスでサーバーにアクセスしている場合、またはローカルのhostsファイルを使用してパブリックDNSをオーバーライドしている場合) IPアドレスが返されない(ホスト名が返されるだけ)か、さらに悪いことに、パブリックDNSレコードに指定された間違ったアドレスが存在するか、ドメインにワイルドカードがある場合に返されます。

状況に応じて、次のような方法で3つ目のアプローチを試すこともできます。

$external_ip = exec('curl http://ipecho.net/plain; echo');

これには独自の欠陥があり(特定のサードパーティサイトに依存し、異なるホストまたはプロキシを介してアウトバウンド接続をルーティングするネットワーク設定が存在する可能性があります)、gethostbynameのように遅い可能性があります。どのアプローチが最も頻繁に正しいかはわかりませんが、心に留めておくべき教訓は、特定のシナリオ/構成がこれらのアプローチのすべてに対して誤った出力をもたらすことです...可能な場合は、あなたがアプローチしていることを確認してくださいusingは期待する値を返します。

10
Ben D

これは、サーバーにインストールされているcurlを心配することなく、上記の例の適応として使用できるものです。

<?php
      // create a new cURL resource
      $ch = curl_init ();

      // set URL and other appropriate options
      curl_setopt ($ch, CURLOPT_URL, "http://ipecho.net/plain");
      curl_setopt ($ch, CURLOPT_HEADER, 0);
      curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

      // grab URL and pass it to the browser

      $ip = curl_exec ($ch);
      echo "The public ip for this server is: $ip";
      // close cURL resource, and free up system resources
      curl_close ($ch);
    ?>
9
Emmanuel Mahuni

$ _ SERVER 配列を確認してください

echo $_SERVER['SERVER_ADDR'];
5
Ale

BashシェルでPHPを使用している場合は、次を使用できます。

$server_name=exec('hostname');

$_SERVER[] SERVER_ADDRHTTP_HostおよびSERVER_NAMEは設定されていないため。

5
Stefano Zanola

前の回答はすべて$ _SERVER ['SERVER_ADDR']を提供します。これは、一部のIISインストールでは機能しません。これをIISで機能させるには、次を使用します。

$server_ip = gethostbyname($_SERVER['SERVER_NAME']);
4
qbert220

IISの$ _SERVER ['REMOTE_ADDR']および$ _SERVER ['SERVER_ADDR']を戻す単純なスクリプトを作成したので、すべての変数を変更する必要はありません。すべてのページに含まれるphpファイルにこのテキストを貼り付けてください。

/** IIS IP Check **/
if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; }
if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; }
2
Xander

上記の回答から何も取得していない場合、および古いバージョンのPHPを使用している場合は、$HTTP_SERVER_VARS['server_ADDR']を使用する必要があります

1
OpenCode

私はこれが私のために働くことがわかった:GetHostByName( "");

Apache Webサーバーを実行しているWindows 7でXAMPP v1.7.1を実行します。残念ながら、ゲートウェイのIPアドレスを提供するだけです。

1
Sanford Staab
$serverIP = $_SERVER["SERVER_ADDR"];
echo "Server IP is: <b>{$serverIP}</b>";
1
Axe