Come identificare l'indirizzo IP del server in PHP

Come posso identificare l'indirizzo IP del server in PHP?

Come questo per l'IP del server:

$_SERVER['SERVER_ADDR']; 

e questo per il porto

 $_SERVER['SERVER_PORT']; 

Se stai usando PHP versione 5.3 o successiva puoi fare quanto segue:

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

Funziona bene quando si esegue uno script autonomo, non eseguito attraverso il server web.

per esempio:

 $_SERVER['SERVER_ADDR'] 

quando sei su IIS, prova:

 $_SERVER['LOCAL_ADDR'] 

Nessuna delle risposte più votate restituirà in modo affidabile l'indirizzo pubblico del server. Generalmente $_SERVER['SERVER_ADDR'] sarà corretto, ma se stai accedendo al server tramite una VPN probabilmente restituirà l'indirizzo di networking interno piuttosto che un indirizzo pubblico, e anche quando non si trova sulla stessa networking alcune configurazioni lo faranno semplicemente essere vuoto o avere qualche altro valore specificato.

Allo stesso modo, ci sono scenari in cui $host= gethostname(); $ip = gethostbyname($host); $host= gethostname(); $ip = gethostbyname($host); non restituirà i valori corretti perché si basa su entrambi i DNS (sia internamente configurati o record esterni) e le impostazioni del nome host del server per estrapolare l'indirizzo IP del server. Entrambi questi passaggi sono potenzialmente difettosi. Ad esempio, se il nome host del server è formattato come un nome di dominio (es. HOSTNAME=yahoo.com ) allora (alless sul mio setup php5.4 / Centos6) gethostbyname salterà direttamente alla ricerca dell'indirizzo di Yahoo.com anziché del locale il server di.

Inoltre, poiché gethostbyname ricade sui record DNS pubblici di un server di test con record DNS pubblici non pubblicati o non corretti (ad esempio, stai accedendo al server da localhost o indirizzo IP o se stai sovrascrivendo DNS pubblico utilizzando il tuo file hosts locale) quindi non riceverai alcun indirizzo IP (restituirà solo il nome host) o, peggio, restituirà l'indirizzo errato specificato nei record DNS pubblici se ne esiste uno o se esiste un carattere jolly per il dominio.

A seconda della situazione, puoi anche provare un terzo approccio facendo qualcosa del genere:

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

Questo ha i suoi difetti (si basa su uno specifico sito di terze parti e potrebbero esserci impostazioni di networking che indirizzano le connessioni in output attraverso un host o un proxy diverso) e come gethostbyname può essere lento. Onestamente non sono sicuro quale approccio sarà corretto più spesso, ma la lezione da prendere a cuore è che scenari / configurazioni specifici generano risultati errati per tutti questi approcci … quindi se ansible verifica che l'approccio che stai usando sta restituendo i valori che ti aspetti.

Controlla la matrix $ _SERVER

 echo $_SERVER['SERVER_ADDR']; 

Le risposte precedenti danno tutte $ _SERVER ['SERVER_ADDR']. Questo non functionrà su alcune installazioni di IIS. Se si desidera che funzioni su IIS, utilizzare quanto segue:

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

Se stai usando PHP in bash shell puoi usare:

 $server_name=exec('hostname'); 

Perché $_SERVER[] SERVER_ADDR , HTTP_HOST e HTTP_HOST non sono impostati.

Ho appena creato un semplice script che restituirà $ _SERVER ['REMOTE_ADDR'] e $ _SERVER ['SERVER_ADDR'] in IIS in modo da non wherer modificare each variabile. Basta incollare questo text nel file php che è incluso in each pagina.

 /** IIS IP Check **/ if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; } if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; } 

Sono arrivato a questa pagina cercando un modo per get il mio indirizzo IP diverso da quello della macchina remota che si connette a me.

Questo non functionrà con una macchina Windows.

Ma nel caso qualcuno cerchi ciò che stavo cercando:

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

(Adattato spudoratamente da Come get l'indirizzo IP principale del computer locale su Linux e OS X? )

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

Potrebbe essere necessario utilizzare $HTTP_SERVER_VARS['server_ADDR'] se non si ottiene nulla dalle risposte precedenti e se si utilizza una versione precedente di PHP

Ho trovato questo funziona per me: GetHostByName ("");

Esecuzione di XAMPP v1.7.1 su Windows 7 con server Web Apache. Sfortunatamente mi limita a fornire l'indirizzo IP del mio gateway.

Questo è quello che potresti usare come adattamento degli esempi sopra senza preoccuparti del ricciolo installato sul tuo server.

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

Come questo:

 $_SERVER['SERVER_ADDR']; 

Controlla la matrix $ _SERVER

 echo $_SERVER['SERVER_ADDR'];