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.
+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.
$_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:
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:
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.
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);?>
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:
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'];}
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
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
Réponses:
Comme ceci pour l'adresse IP du serveur:
et ceci pour le port
la source
John K
plutôt la réponse parSi vous utilisez PHP version 5.3 ou supérieure, vous pouvez effectuer les opérations suivantes:
Cela fonctionne bien lorsque vous exécutez un script autonome, et non via le serveur Web.
la source
/etc/hosts
fichier et sera rapide - bien que cela puisse être juste127.0.0.1
. S'il doit appeler DNS, il sera lent comme vous le dites.par exemple:
lorsque vous êtes sur IIS, essayez:
la source
$_SERVER['LOCAL_ADDR']
est uniquement disponible sous IIS lorsque PHP est exécuté en tant que module CGI.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:
(Adapté sans vergogne de Comment obtenir l'adresse IP principale de la machine locale sous Linux et OS X? )
la source
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\.'
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-à-direHOSTNAME=yahoo.com
), alors (au moins sur ma configuration php5.4 / Centos6)gethostbyname
sautera directement à la recherche de l'adresse de Yahoo.com plutôt que de celle du serveur local.De plus, parce que
gethostbyname
se 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 parlocalhost
une adresse IP ou si vous remplacez le DNS public à l'aide de votrehosts
fichier 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:
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
cela 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.la source
C'est ce que vous pourriez utiliser comme adaptation des exemples ci-dessus sans vous soucier de curl installé sur votre serveur.
la source
Vérifiez le tableau $ _SERVER
la source
Si vous utilisez PHP dans le shell bash, vous pouvez utiliser:
Parce que
$_SERVER[] SERVER_ADDR
,HTTP_HOST
etSERVER_NAME
ne sont pas définis.la source
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:
la source
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.
la source
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.
la source
la source
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 PHPla source
Vérifiez le tableau $ _SERVER
la source
$_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.phpComme ça:
la source