Réponses:
Comme ceci pour l'adresse IP du serveur:
$_SERVER['SERVER_ADDR'];
et ceci pour le port
$_SERVER['SERVER_PORT'];
John K
plutôt la réponse par
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.
/etc/hosts
fichier 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.
par exemple:
$_SERVER['SERVER_ADDR']
lorsque vous êtes sur IIS, essayez:
$_SERVER['LOCAL_ADDR']
$_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:
#! /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? )
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-à-dire HOSTNAME=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 par localhost
une adresse IP ou si vous remplacez le DNS public à l'aide de votre hosts
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:
$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
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.
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);
?>
Si vous utilisez PHP dans le shell bash, vous pouvez utiliser:
$server_name=exec('hostname');
Parce que $_SERVER[] SERVER_ADDR
, HTTP_HOST
et SERVER_NAME
ne sont pas définis.
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.
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']; }
Vérifiez le tableau $ _SERVER
echo $_SERVER['SERVER_ADDR'];
$_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
Comme ça:
$_SERVER['SERVER_ADDR'];