2012-03-28 75 views
9

私はビジネスのローカルネットワーク上でのみ実行されるPHPアプリケーションを開発しています。 Stunnix Advanced Webserverを使用して作成したようなカスタムインストーラを使用して、アプリケーションがサーバーにインストールされます。PHPを使用してサーバーのローカルIPアドレスを取得するにはどうすればよいですか?

アプリケーションをより使いやすくするために、私はのLOCAL IPを表示することを計画しています。ネットワーク内の他のコンピュータがアプリケーションにアクセスすることは非常に簡単です。アドレスバー。

問題は私がサーバのローカルIPを得ることができないことです。私は

SERVER_NAME(表示だけ127.0.0.1)

REMOTE_ADDR(表示クライアント外部IP)

SERVER_ADDRディスプレイ正しいIPを試してみましたが、それはそうだけん

その目的を完全に無効にするIPを使用してクライアントからアクセスする場合。

サーバーのローカルIPを表示するには、サーバーから直接http://localhostにアクセスしてください。

私はこれができないと確信しています。しかし、もしあれば、助けてください。

EDIT

私は事のクロスプラットフォームのPHPサーバアプリケーションの種類を開発しています。 Apache、PHPインストーラ、SQliteデータベースをPHPアプリケーションとワンクリックインストーラとしてバンドルし、できるだけユーザーフレンドリーなものにします。誰でも、Windows、MacまたはLinuxを実行しているコンピュータに誰でも展開できます。インストール後、ユーザーがサーバー上のアプリケーションを開くと、のIPアドレス[ローカルIP]と、このサーバーへの接続に使用できるポートが表示されます。アプリケーションはローカルネットワーク上でのみ実行され、インターネット上では実行されません。

Air DroidのAndroidアプリと同じように、ローカルIPが表示されるはずです。 スクリーンショット:https://lh3.ggpht.com/PmLopRm-Lj9WTnzm2MBI-bTbCLopAyqtd4C_4nvyDwLg8X0QwDbBbEREdWGHG5xku4s

答えて

12

あなたはここにある問題は、これは情報の静的な作品ではないということです。任意のコンピュータは、複数のネットワークカードに関連付けられた複数のIPアドレスを持つことができます。それらのいくつか/すべて/どれも、Webサービスを利用できるものがあります。あなたがOSに求めている質問には、1つの答えがないかもしれません。

サーバがシンプルで単一のIPアドレス設定を持っている場合は、これをハードコードするのが最善でしょう。最も簡単なオプションです。あなたが動的に決定したい場合は、ここであなたがうまくいけば便利な情報のいくつかのビットは、次のとおりです。

  • $_SERVER['HTTP_HOST']は、ページにアクセスするためには、ブラウザのアドレスバーに入力されたアドレスが含まれています。ブラウザにhttp://192.168.0.1/index.phpと入力してページにアクセスすると、$_SERVER['HTTP_HOST']192.168.0.1になります。
  • DNS名を使用してページにアクセスした場合、gethostbyname($_SERVER['HTTP_HOST']);はそのDNS名をIPアドレスに変換します。
  • $_SERVER['SERVER_NAME']には、Webサーバー構成でサーバー名として構成された名前が含まれています。これを使うつもりならば、PHPでハードコードするだけでよいでしょう。
  • $_SERVER['SERVER_ADDR']には、サーバーのプライマリIPアドレスのオペレーティングシステムが含まれます。これは、ページにアクセスするために使用されたIPアドレスであってもなくてもよく、ウェブサーバがバインドされたIPアドレスであってもなくてもよい。 OSとサーバーの設定に大きく依存します。サーバーに単一のIPアドレスがある場合、これはとなります。おそらくとなりますが、これには127.0.0.1が含まれることがあります。

長すぎるのは、ページを生成するためにWebサーバーに送信された情報を調べることなく、Webサーバーの動作保証されたIPアドレスを決定する100%信頼できる方法がないことですあなたが作成しているのは、あなたが言う通り、totally defeats its purposeです。

+0

ありがとうございました。それは本当に理にかなっています。サーバーが2つのネットワークに接続されている場合(イーサネットやWiFiに接続されたラップトップなど)、正しいネットワークとIPを選択することが非常に信頼できないと私は同意します。私はそんなことは考えていませんでした。 ところで、ユーザが自分自身で自分のIPアドレスを見つける作るには、アプリケーション少ないN00B優しいけれどもなります。 :(それ@ajaybc – ajaybc

+1

は、DNSが何のためにあるのかだ...それはすべてのローカルだ場合、それはだ場合、あなただけのドメインを指して、インターネット経由で、ネットワークにアクセスするマシン名を使用することができます/サブドメインは、あなたのIP ;-) – DaveRandom

0

試してみてください。

<?php gethostbyname($_SERVER['SERVER_NAME']);

はEDIT:

ビットハックが、動作するようです:

<?php 
$str = file_get_contents("http://ip6.me/"); 
$pattern = "#\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b#"; 
preg_match($pattern, $str, $matches); 
print_r($matches[0]); 

しかし、これは第三ウェブサイトに依存しています。 。

+0

申し訳ありませんが、これは動作しません。 ** 127.0.0.1 **と表示されているためです。私が欲しいのは、サーバーのローカルIPである** 192.168.1.6 **のようなIPです。 – ajaybc

+0

あなたの編集も試しました。しかし、それはちょうどサーバーの**外部IP **を取得します。私が必要とするのは、サーバーの**ローカルIP **です。ありがとうございました – ajaybc

0

あなたはコマンドで使用可能なすべての情報を見ることができます:

print_r($_SERVER, 1); 
2

これは可能ではないことも確信しています。可能であれば、結果は信頼できません。

複数のIPアドレスを持つサーバーがあります。また、サーバー上のHTTPに使用されるIPアドレスは、他の場所からサーバーに到達するために使用されるIPアドレスではない場合があります(リバースプロキシまたはNATが関係する場合)。 SERVER_ADDR変数は、PHPスクリプトの呼び出しに使用されたIPアドレスを示します。この情報はWebサーバーから渡されるため、スタンドアロン(つまりシェルから)で実行されているPHPスクリプトには役立ちません。

これを別の方法で見てみましょう。どのような問題を解決しようとしていますか?つまり、なぜサーバーのローカルIPが必要ですか?動作しないソリューションを実装するのに役立つのではなく、元の問題を見て、可能な別のソリューションがあるかどうかを見てみましょう。

オペレーティングシステムによっては、ifconfig -aまたはip addrのようなシェルコマンドの出力を解析することによって、さまざまなインターフェイスに割り当てられたIPのリストを取得する方法があるかもしれません。しかし、私はあなたのOSを知らないので、それがあなたのためにどのように働くかを示唆することはできません。

$h = popen("ip addr | awk '/inet/{print$2}'"); 
$ip_list = array(); 
while ($ip_list[] = fread($h, 15)) { } 
pclose($h); 

あなたはパイプにawkを使用しないようにPHPに多くのロジックを置くことができますが、あなたのアイデアを得ます。

+0

私の記録です相互プラットフォームのPHPサーバーアプリケーションの種類のものを開発しています。 Apache、PHPインストーラ、SQliteデータベースをPHPアプリケーションとワンクリックインストーラとしてバンドルし、できるだけユーザーフレンドリーなものにします。誰でも自分のコンピュータに展開できます。 – ajaybc

+0

さて、あなたがアプリケーションを実行しているオペレーティングシステムの人や、セーフモードがオンになっているかどうかわからない場合は、シェルツールはこれを助けません。私が言うように、あなたが思いついた解決策ではなく、解決しようとしている問題を記述することができれば、私たちはあなたの解決策を実装するのを助けるのではなく、その問題を解決するのを助けることができます。 – ghoti

+0

私の質問を編集してください。ありがとう – ajaybc

3

ソリューション:PHPで

  1. 打ち(インストール時に1があなたのスクリプトでこれを編集する必要があります)
  2. セットアップはApache環境での変数それは、PHPを介してアクセスすることができるよう(インストール時に1がにこれを追加する必要がありますApacheの設定)
  3. は、ループバックインターフェイスを除外し、マシンのネットワークインターフェイスのIPアドレスを決定するためにifconfig -lまたはipconfig -a出力を解析します。最良のケースでは、1つのIPアドレスを受け取ります。これは必要なアドレスになり、$_SERVER['SERVER_PORT']が追加されます。複数のIPアドレスを取得する場合は、$_SERVER['SERVER_PORT']でHTTPリクエストに答えるかどうかをすべて照会してみることができます。マシンは異なるIPアドレスに複数のHTTPサーバを実行する場合も、あなたのIPアドレスを決定するためにecho "my application";のいくつかの種類と/ping.phpファイルを置くことができます。
+0

質問に私の編集を参照してください – ajaybc

+0

さて、私は3番目の部分を使用します。しかし、PHPは 'exec()'を実行し、OSに依存して異なる構文解析アルゴリズムを使うことができるはずです - Windowsでは 'ipconfig -a'、unixでは' ifconfig -l'などです。 –

2

あなたは192.168.x.x同様LAN IP住所を取得したい場合は、次のコードを使用することができます:私はこれを使用して、完全に私の要件を満たしてい

を。 (Windowsマシンのみでテスト済み)

function getLocalIP(){ 
    exec("ipconfig /all", $output); 
     foreach($output as $line){ 
      if (preg_match("/(.*)IPv4 Address(.*)/", $line)){ 
       $ip = $line; 
       $ip = str_replace("IPv4 Address. . . . . . . . . . . :","",$ip); 
       $ip = str_replace("(Preferred)","",$ip); 
      } 
     } 
    return $ip; 
} 

echo $ip = getLocalIP(); //This will return: 192.168.x.x (Your Local IP) 

希望します。 =)

+2

'ipconfig'はWindowsのみです。それほど役に立たない。 – kodeart

0

"のifconfig EN1のINET" コマンドを使用してみてください。

print_r(exec("ifconfig en1 inet"));

出力: - INET 192.168。 。 192.168放送0xffffff00ネットマスク。*。255

+0

ifconfigはウィンドウ用ではありません –

関連する問題