Comment identifier l'adresse IP du serveur en PHP

122

Comment puis-je identifier l'adresse IP du serveur en PHP?

pooja
la source
2
voulez-vous dire l'adresse IP de la demande ou l'adresse IP de la machine exécutant votre application?
wosis le

Réponses:

175

Comme ceci pour l'adresse IP du serveur:

$_SERVER['SERVER_ADDR'];

et ceci pour le port

$_SERVER['SERVER_PORT'];
NuageuxMarbre
la source
9
Non. Sur certains hôtes partagés, cela renvoie :: 1
TheRealChx101
3
Cela peut être incorrect en fonction de l'équilibreur de charge utilisé devant votre serveur Web. Vous voulez aussi l'en-tête X-Forwarded-For dans ce scénario: en.wikipedia.org/wiki/X-Forwarded-For
Ligemer
31
Ce n'est PAS l'adresse du serveur! Il s'agit de l'adresse que le navigateur distant appelle le serveur, qui est sous le contrôle de l'utilisateur distant. Utilisez John Kplutôt la réponse par
Ariel
Cela ne donne pas l'adresse IP du serveur. Pour une raison quelconque, il donne mon adresse IP locale
Thomas Williams
Il ne donne pas non plus l'adresse du serveur php-fpm, mais est pour le serveur Web associé (nginx, apache). Donc, ce ne sera pas correct pour la spécification d'hôte mysql-client (utilisateur @ hôte).
scipilot
105

Si vous utilisez PHP version 5.3 ou supérieure, vous pouvez effectuer les opérations suivantes:

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

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

John K
la source
Parfait, ce que je recherche. Merci John
Frank
6
+1 C'est la seule solution qui fonctionnera avec la ligne de commande.
Adam Elsodaney
2
@andreas Ça ne devrait pas. Le nom d'hôte local devrait être dans le /etc/hostsfichier et sera rapide - bien que cela puisse être juste 127.0.0.1. S'il doit appeler DNS, il sera lent comme vous le dites.
Ariel
+1 mais juste une question .. je l'essaie avec xampp sur un serveur local et il renvoie l'ip 192.168etc mais .. il devrait être 127.0.0.1 non ??
Andrea Bori
cela fonctionne pour moi mais une machine son nom de domaine d'affichage. comment résoudre ce problème.
Dharani Dharan
19

par exemple:

$_SERVER['SERVER_ADDR']

lorsque vous êtes sur IIS, essayez:

$_SERVER['LOCAL_ADDR']
Ballon
la source
2
$_SERVER['LOCAL_ADDR']est uniquement disponible sous IIS lorsque PHP est exécuté en tant que module CGI.
Rudi Visser
@rudi_visser cela fonctionne aussi avec fastcgi, mais si vous vous connectez via locahost, vous récupérez :: 1 à la place. Si vous vous connectez via le nom ou l'adresse IP du serveur, vous récupérez la véritable adresse IP.
starbeamrainbowlabs
@starbeamrainbowlabs FastCGI est CGI :) Je voulais dire, contrairement au fonctionnement en tant que module ISAPI, cela a été écrit avant l'avènement majeur de FastCGI en tant que plate-forme stable.
Rudi Visser
@starbeamrainbowlabs tout ce qui ressemble à :: 1 est probablement une adresse IP6
Toby Allen
@TobyAllen Merci :). La chose étrange est que mon réseau ne prend pas en charge ipv6, mais mon serveur (machine Windows 7) signale son IP comme :: 1, l'adresse de bouclage ipv6.
starbeamrainbowlabs
13

Je suis venu sur cette page à la recherche d'un moyen d'obtenir ma propre adresse IP et non celle de la machine distante qui me connecte.

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

Dom
la source
C'est la seule option qui fonctionne réellement lors de l'exécution de scripts PHP à partir du shell. Question: quand il y a plusieurs interfaces actives, comment cela décide-t-il quelle adresse renvoyer? J'ai testé avec des connexions Ethernet filaires et sans fil actives, puis avec uniquement le sans fil actif, et il renvoie l'IP wlan les deux fois. Bon script, merci!
Ryan Griggs
Il ne sait pas vraiment lequel retourner. Il renvoie simplement la dernière interface inet à partir de la sortie d'ifconfig, mais en ignorant 127.0.0.1. Si vous ne disposez que des interfaces "habituelles", alors cela fait un très bon travail. Il est probablement plus sûr si vous spécifiez l'interface que vous voulez "ifconfig wlan0 | ...". Ce script n'est en aucun cas parfait, mais il fonctionne dans des paramètres simples et il montre comment le faire en principe, à ajuster au besoin.
Dom
1
ifconfig | grep 'inet addr' | couper -d ':' -f 2 | awk '{imprimer $ 1}' | grep -vE '^ (192 \ .168 | 10 \. | 172 \ .1 [6789] \. | 172 \ .2 [0-9] \. | 172 \ .3 [01] \. | 127 \. ) 'est ma dernière révision de ceci. Il filtre toutes les ips locales et ne vous donne que des externes
Dom
J'ai plusieurs interfaces réseau, donc je l'ai faitifconfig | 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\.'
Jonathan
10

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

De même, il existe des scénarios dans lesquels $host= gethostname(); $ip = gethostbyname($host);ne renvoie pas les valeurs correctes car il repose à la fois sur le DNS (soit des 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) gethostbynamesautera directement à la recherche de l'adresse de Yahoo.com plutôt que de celle du serveur local.

De plus, parce que gethostbynamese rabat sur les 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 localhostune adresse IP ou si vous remplacez le DNS public à l'aide de votre hostsfichier local ), alors vous ' ll ne récupérera aucune adresse IP (il retournera simplement le nom d'hôte) ou pire encore, il retournera la mauvaise adresse spécifiée dans les enregistrements DNS publics s'il en existe une ou s'il y a un joker pour le domaine.

Selon la situation, vous pouvez également essayer une troisième approche en faisant quelque chose comme ceci:

$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 gethostbynamecela peut être lent. Honnêtement, je ne sais pas quelle approche sera la plus souvent correcte, mais la leçon à retenir est que des scénarios / configurations spécifiques entraîneront des sorties incorrectes pour toutes ces approches ... donc si possible, vérifiez que l'approche que vous êtes l'utilisation renvoie les valeurs attendues.

Pliez
la source
9

C'est ce que vous pourriez utiliser comme 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);
    ?>
Emmanuel Mahuni
la source
5

Si vous utilisez PHP dans le shell bash, vous pouvez utiliser:

$server_name=exec('hostname');

Parce que $_SERVER[] SERVER_ADDR, HTTP_HOSTet SERVER_NAMEne sont pas définis.

Stefano Zanola
la source
4

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 ce qui suit:

$server_ip = gethostbyname($_SERVER['SERVER_NAME']);
qbert220
la source
2

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

Exécution de XAMPP v1.7.1 sur Windows 7 exécutant le serveur Web Apache. Malheureusement, il donne simplement l'adresse IP de ma passerelle.

Sanford Staab
la source
2

Je viens de créer un script simple qui ramènera les $ _SERVER ['REMOTE_ADDR'] et $ _SERVER ['SERVER_ADDR'] dans IIS afin que vous n'ayez pas à changer toutes les variables. Collez simplement 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']; }
Alex
la source
1
$serverIP = $_SERVER["SERVER_ADDR"];
echo "Server IP is: <b>{$serverIP}</b>";
Hache
la source
1

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

OpenCode
la source
0

Vérifiez le tableau $ _SERVER

echo $_SERVER['SERVER_ADDR'];
Gaurang
la source
1
Cela ne trouve pas la "vraie IP", il trouve des en-têtes HTTP arbitraires et non vérifiés que n'importe qui peut définir et n'importe qui peut utiliser pour usurper son IP si vous les préférez. Si le client est derrière un proxy, qu'il en soit ainsi, ne faites confiance à aucun en-tête HTTP. Cela ne correspond pas du tout à la question.
deceze
2
Je ne comprends pas comment cette réponse ne correspond pas du tout à la question. La question était: "Comment puis-je identifier l'adresse IP du serveur en PHP?". Le PO devrait-il apprendre à mieux poser ou devriez-vous apprendre à lire une question. De plus, si le client est derrière un proxy, vous êtes toujours foutu, peu importe ce que vous essayez du côté serveur. Un scénario totalement différent est celui où le serveur est derrière un proxy, puisque vous pouvez vérifier avec les en-têtes X-FORWARDED-FOR.
Luis Masuelli
@deceze $_SERVER["SERVER_ADDR"]n'a rien à voir avec les en-têtes HTTP. Ceci est rempli par le logiciel serveur, tous les éléments liés à HTTP dans $ _SERVER sont préfixés avec HTTP_. php.net/manual/en/reserved.variables.server.php
poncha
@poncha Mon commentaire concernait la révision originale de ce message.
deceze
-1

Comme ça:

$_SERVER['SERVER_ADDR'];
Shadow Wizard est une oreille pour vous
la source