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


122

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


2
リクエストIPアドレスまたはアプリを実行しているマシンのIPを意味しますか?
wosis

回答:


175

サーバーIPの場合は次のようになります。

$_SERVER['SERVER_ADDR'];

そして、これはポート

$_SERVER['SERVER_PORT'];

9
いいえ。一部の共有ホストでは、これは:: 1を返します
TheRealChx101

3
これは、Webサーバーの前で使用されているロードバランサーによっては正しくない場合があります。:あなたがX-Forwarded-Forヘッダーだけでなく、このシナリオで必要en.wikipedia.org/wiki/X-Forwarded-For
Ligemer

31
これはサーバーアドレスではありません!これは、リモートブラウザがサーバーを呼び出すアドレスであり、リモートユーザーの制御下にあります。John K代わりに回答を使用してください
Ariel

これはサーバーにIPを与えません。どういうわけかそれは私のローカルIPを与えています
トーマス・ウィリアムズ

また、php-fpmサーバーのアドレスも提供しませんが、関連するWebサーバー(nginx、apache)用です。そのため、mysql-clientホスト仕様(user @ host)には正しくありません。
scipilot 2018

105

PHPバージョン5.3以降を使用している場合は、以下を実行できます。

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

これは、Webサーバーを介して実行するのではなく、スタンドアロンスクリプトを実行するときにうまく機能します。


パーフェクト、私が探しているもの。おかげでジョン
フランク

6
+1これは、コマンドラインで機能する唯一のソリューションです。
アダムElsodaney 2014年

2
@andreasすべきではない。ローカルホスト名は/etc/hostsファイルに含まれている必要があり、高速になりますが、それだけの場合もあります127.0.0.1。DNSを呼び出す必要がある場合は、言うように遅くなります。
アリエル

+1だけですが、質問です。ローカルサーバーのxamppで試してみると、IP 192.168などが返されますが、127.0.0.1でなければなりませんか?
Andrea Bori 2015年

これは私にとっては機能しますが、一部のマシンではドメイン名が表示されます。この問題を修正する方法。
Dharani Dharan

19

例えば:

$_SERVER['SERVER_ADDR']

IISの場合は、次のことを試してください。

$_SERVER['LOCAL_ADDR']

2
$_SERVER['LOCAL_ADDR']PHPがCGIモジュールとして実行されている場合、IISでのみ使用できます。
Rudi Visser、

@rudi_visserはfastcgiでも動作しますが、locahost経由で接続すると、代わりに:: 1が返されます。サーバー名またはIP経由で接続すると、実際のIPが返されます。
starbeamrainbowlabs 2012

@starbeamrainbowlabs FastCGI CGIです:) ISAPIモジュールとして実行するのとは対照的に、これはFastCGIが安定したプラットフォームとして登場する前に作成されました。
Rudi Visser、2012

@starbeamrainbowlabs :: 1のようなものはおそらくIP6アドレスです
Toby Allen

@TobyAllenありがとうございます。奇妙なことに、私のネットワークはipv6をサポートしていませんが、サーバー(Windows 7マシン)はそのIPを:: 1、つまりipv6ループバックアドレスとして報告しています。
starbeamrainbowlabs 2012

13

このページにアクセスして、自分に接続しているリモートマシンの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アドレスを取得する方法から恥知らずに適応


これは、シェルからPHPスクリプトを実行するときに実際に機能する唯一のオプションです。質問:アクティブなインターフェースが複数ある場合、これはどのアドレスを返すかをどのように決定しますか?有線とワイヤレスのイーサネット接続をアクティブにしてテストし、次にワイヤレスのみをアクティブにしてテストすると、どちらの場合もwlan ipが返されました。良いスクリプト、ありがとう!
Ryan Griggs、

どちらを返すかは実際にはわかりません。ifconfigの出力から最後のinetインターフェースを返すだけですが、127.0.0.1は無視します。「通常の」インターフェースしかない場合は、かなりうまくいきます。"ifconfig wlan0 | ..."にするインターフェースを指定するのがおそらく最も安全です。このスクリプトは完全なものではありませんが、簡単な設定で機能し、必要に応じて調整するための原則を示しています。
ドム

1
ifconfig | grep 'inet addr' | カット-d ':' -f 2 | awk '{print $ 1}' | grep -vE '^(192 \ .168 | 10 \。| 172 \ .1 [6789] \。| 172 \ .2 [0-9] \。| 172 \ .3 [01] \。| 127 \。 ) 'これが私の最新のリビジョンです。すべてのローカルIPを除外し、外部のみを提供します
Dom

私は複数のネットワークインターフェイスを持っているので、私はそうしましたifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | grep -e '192\.168\.1\.'
ジョナサン

10

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

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

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

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

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

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


9

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

<?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);
    ?>


5

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

$server_name=exec('hostname');

そのため$_SERVER[] SERVER_ADDRHTTP_HOSTおよびSERVER_NAME設定されていません。


4

以前の答えはすべて$ _SERVER ['SERVER_ADDR']を与えます。これは、一部のIISインストールでは機能しません。これをIISで機能させる場合は、以下を使用します。

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

2

私はこれがうまくいくことを発見しました:GetHostByName( "");

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


2

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']; }

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

1

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


0

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

echo $_SERVER['SERVER_ADDR'];

1
それは「本当のIP」を見つけるのではなく、誰でも設定できる任意の未検証のHTTPヘッダーを見つけ、必要に応じて誰もがIPを偽装するために使用する可能性があります。クライアントがプロキシの背後にある場合は、プロキシもそうです。HTTPヘッダーを信頼しないでください。これも問題にまったく当てはまりません。
だます

2
この回答がどのようにして質問に合わないのか理解できません。問題は、「PHPでサーバーのIPアドレスを特定するにはどうすればよいですか?」でした。OPはより良い質問の仕方を学ぶべきか、それとも質問の読み方を学ぶべきか。さらに、クライアントがプロキシの背後にある場合でも、サーバー側から何をしようとしても失敗します。X-FORWARDED-FORヘッダーで確認できるため、サーバーがプロキシの背後にある場合とはまったく異なるシナリオです。
Luis Masuelli 2014年

@deceze $_SERVER["SERVER_ADDR"]はHTTPヘッダーとは何の関係もありません。これはサーバーソフトウェアによって入力され、$ _ SERVER内のすべてのHTTP関連のものはHTTP_で始まります。php.net/manual/en/reserved.variables.server.php
poncha

@poncha私のコメントは、この投稿の最初の改訂に関するものでした。
だます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.