PHPでサーバーのIPアドレスを特定するにはどうすればよいですか?
サーバーIPの場合:
$_SERVER['SERVER_ADDR'];
そしてこれは港のために
$_SERVER['SERVER_PORT'];
PHPバージョン5.3以降を使用している場合、次のことができます。
$Host= gethostname();
$ip = gethostbyname($Host);
これは、Webサーバー経由ではなく、スタンドアロンスクリプトを実行している場合に有効です。
例えば:
$_SERVER['SERVER_ADDR']
iISを使用している場合:
$_SERVER['LOCAL_ADDR']
このページにアクセスして、自分に接続しているリモートマシンの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;
最も多く投票された回答はどちらも、サーバーのパブリックアドレスを確実に返しません。通常、$_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は期待する値を返します。
これは、サーバーにインストールされている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);
?>
$ _ SERVER 配列を確認してください
echo $_SERVER['SERVER_ADDR'];
BashシェルでPHPを使用している場合は、次を使用できます。
$server_name=exec('hostname');
$_SERVER[] SERVER_ADDR
、HTTP_Host
およびSERVER_NAME
は設定されていないため。
前の回答はすべて$ _SERVER ['SERVER_ADDR']を提供します。これは、一部のIISインストールでは機能しません。これをIISで機能させるには、次を使用します。
$server_ip = gethostbyname($_SERVER['SERVER_NAME']);
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']; }
上記の回答から何も取得していない場合、および古いバージョンのPHPを使用している場合は、$HTTP_SERVER_VARS['server_ADDR']
を使用する必要があります
私はこれが私のために働くことがわかった:GetHostByName( "");
Apache Webサーバーを実行しているWindows 7でXAMPP v1.7.1を実行します。残念ながら、ゲートウェイのIPアドレスを提供するだけです。
$serverIP = $_SERVER["SERVER_ADDR"];
echo "Server IP is: <b>{$serverIP}</b>";