Risposte:
In questo modo per l'ip del server:
$_SERVER['SERVER_ADDR'];
e questo per il porto
$_SERVER['SERVER_PORT'];
John K
invece
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 in esecuzione attraverso il server web.
/etc/hosts
file e sarà veloce, anche se potrebbe esserlo 127.0.0.1
. Se deve chiamare DNS, sarà lento come dici tu.
per esempio:
$_SERVER['SERVER_ADDR']
quando sei su IIS, prova:
$_SERVER['LOCAL_ADDR']
$_SERVER['LOCAL_ADDR']
è disponibile solo in IIS quando PHP è in esecuzione come modulo CGI.
Sono arrivato in questa pagina cercando un modo per ottenere il mio indirizzo IP non quello della macchina remota che si connette a me.
Questo non funzionerà per una macchina Windows.
Ma nel caso in cui qualcuno cerchi quello 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;
(Spudoratamente adattato da Come ottengo l'indirizzo IP principale della macchina locale su Linux e 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\.'
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 rete interno piuttosto che un indirizzo pubblico, e anche quando non si trova sulla stessa rete alcune configurazioni saranno semplicemente vuote o ne avranno altre specificate valore.
Allo stesso modo, ci sono scenari in cui $host= gethostname(); $ip = gethostbyname($host);
non restituirà i valori corretti perché si basa su entrambi i DNS (record configurati internamente o 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 (cioè HOSTNAME=yahoo.com
), allora (almeno sulla mia configurazione php5.4 / Centos6) salterò gethostbyname
direttamente alla ricerca dell'indirizzo di Yahoo.com anziché di quello del server locale.
Inoltre, poiché gethostbyname
ricade sui record DNS pubblici un server di test con record DNS pubblici non pubblicati o errati (ad esempio, stai accedendo al server tramite localhost
o indirizzo IP, o se stai sovrascrivendo il DNS pubblico utilizzando il tuo hosts
file locale ), allora tu ' non restituirà alcun indirizzo IP (restituirà solo il nome host) o, peggio ancora, restituirà l'indirizzo sbagliato specificato nei record DNS pubblici se ne esiste uno o se è presente 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 rete che instradano le connessioni in uscita attraverso un host o un proxy diverso) e gethostbyname
può essere lento. Onestamente non sono sicuro di quale approccio sarà corretto più spesso, ma la lezione da prendere a cuore è che scenari / configurazioni specifici comporteranno output errati per tutti questi approcci ... quindi, se possibile, verifica che l'approccio tu using sta restituendo i valori che ti aspetti.
Questo è ciò che potresti usare come adattamento degli esempi precedenti senza preoccuparti di curl 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);
?>
Se stai usando PHP nella shell bash puoi usare:
$server_name=exec('hostname');
Perché $_SERVER[] SERVER_ADDR
, HTTP_HOST
e SERVER_NAME
non sono impostati.
Ho trovato che funziona per me: GetHostByName ("");
Esecuzione di XAMPP v1.7.1 su Windows 7 con server web Apache. Sfortunatamente fornisce solo il mio indirizzo IP del gateway.
Ho appena creato un semplice script che riporterà $ _SERVER ['REMOTE_ADDR'] e $ _SERVER ['SERVER_ADDR'] in IIS in modo da non dover cambiare ogni variabile. Basta incollare questo testo nel tuo file php che è incluso in ogni pagina.
/** IIS IP Check **/
if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; }
if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; }
Controlla l'array $ _SERVER
echo $_SERVER['SERVER_ADDR'];
$_SERVER["SERVER_ADDR"]
non ha nulla a che fare con le intestazioni HTTP. Questo è riempito dal software del server, tutte le cose relative a HTTP in $ _SERVER hanno il prefisso HTTP_. php.net/manual/en/reserved.variables.server.php
Come questo:
$_SERVER['SERVER_ADDR'];