web-dev-qa-db-fra.com

Comment identifier l'adresse IP du serveur dans PHP

Comment identifier l'adresse IP du serveur en PHP?

110
pooja

Comme ceci pour l'ip du serveur:

$_SERVER['SERVER_ADDR'];

et ceci pour le port

$_SERVER['SERVER_PORT'];
168
CloudyMarble

Si vous utilisez PHP version 5.3 ou supérieure, vous pouvez procéder comme suit:

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

Cela fonctionne bien lorsque vous exécutez un script autonome et non via le serveur Web.

94
John K

par exemple:

$_SERVER['SERVER_ADDR']

lorsque vous êtes sur IIS, essayez:

$_SERVER['LOCAL_ADDR']
19
Flask

Je suis venu sur cette page à la recherche d'un moyen d'obtenir ma propre adresse IP et non celle de la machine distante connectée à moi.

Cela ne fonctionnera pas pour une machine Windows.

Mais au cas où quelqu'un chercherait ce que je cherchais:

#! /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;

(Adapté sans vergogne de Comment obtenir l'adresse IP principale de la machine locale sous Linux et OS X? )

12
Dom

Aucune des réponses les plus votées ne renverra de manière fiable l'adresse publique du serveur. Généralement $_SERVER['SERVER_ADDR'] sera correct, mais si vous accédez au serveur via un VPN, l'adresse interne du réseau sera probablement renvoyée plutôt qu'une adresse publique. Même si elles ne sont pas sur le même réseau, certaines configurations resteront tout simplement vides. ou avoir une autre valeur spécifiée.

De même, il existe des scénarios dans lesquels $Host= gethostname(); $ip = gethostbyname($Host); ne renverra pas les valeurs correctes, car il repose à la fois sur le DNS (enregistrements configurés en interne ou externes) et sur les paramètres de nom d'hôte du serveur pour extrapoler l'adresse IP du serveur. Ces deux étapes sont potentiellement défectueuses. Par exemple, si le nom d'hôte du serveur est formaté comme un nom de domaine (c'est-à-dire HOSTNAME=yahoo.com), alors (au moins sur ma configuration php5.4/Centos6) _ gethostbyname va directement rechercher l'adresse de Yahoo.com plutôt que du serveur local.

De plus, étant donné que gethostbyname a recours aux enregistrements DNS publics, un serveur de test avec des enregistrements DNS publics non publiés ou incorrects (par exemple, vous accédez au serveur par localhost ou adresse IP, ou si vous écrasez DNS public utilisant votre fichier local hosts) vous obtiendrez alors soit aucune adresse IP (il ne fera que renvoyer le nom d’hôte), ou pire, il renverra la mauvaise adresse spécifiée dans les enregistrements DNS publics s’il en existe une ou si il y a un joker pour le domaine.

Selon la situation, vous pouvez également essayer une troisième approche en procédant comme suit:

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

Cela a ses propres défauts (repose sur un site tiers spécifique et il peut y avoir des paramètres réseau qui acheminent les connexions sortantes via un hôte ou un proxy différent) et, comme gethostbyname, il peut être lent. Honnêtement, je ne sais pas trop quelle approche sera la plus correcte, mais la leçon à retenir est que des scénarios/configurations spécifiques donneront des résultats incorrects pour toutes ces approches ... alors, si possible, vérifiez que l'approche est correcte. utiliser revient aux valeurs que vous attendez.

10
Ben D

C’est ce que vous pourriez utiliser comme une adaptation des exemples ci-dessus sans vous soucier de curl installé sur votre serveur.

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

Vérifiez le tableau $ _ SERVER

echo $_SERVER['SERVER_ADDR'];
5
Ale

Si vous utilisez PHP dans bash Shell, vous pouvez utiliser:

$server_name=exec('hostname');

Parce que $_SERVER[] SERVER_ADDR, HTTP_Host et SERVER_NAME ne sont pas définis.

5
Stefano Zanola

Les réponses précédentes donnent toutes $ _SERVER ['SERVER_ADDR']. Cela ne fonctionnera pas sur certaines installations IIS. Si vous souhaitez que cela fonctionne sur IIS, utilisez les éléments suivants:

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

Je viens de créer un script simple qui ramène les variables $ _SERVER ['REMOTE_ADDR'] et $ _SERVER ['SERVER_ADDR'] dans IIS afin que vous n'ayez pas à modifier toutes les variables. Il suffit de coller ce texte dans votre fichier php qui est inclus dans chaque page.

/** 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

Vous devrez peut-être utiliser $HTTP_SERVER_VARS['server_ADDR'] si vous n'obtenez rien des réponses précédentes et si vous utilisez une version plus ancienne de PHP

1
OpenCode

J'ai trouvé que cela fonctionnait pour moi: GetHostByName ("");

Exécution de XAMPP v1.7.1 sur Windows 7 avec le serveur Web Apache. Malheureusement, il suffit de donner mon adresse IP de passerelle.

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