Risposte:
In questo modo per l'ip del server:
$_SERVER['SERVER_ADDR'];
e questo per il porto
$_SERVER['SERVER_PORT'];
John Kinvece
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/hostsfile 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ò gethostbynamedirettamente alla ricerca dell'indirizzo di Yahoo.com anziché di quello del server locale.
Inoltre, poiché gethostbynamericade sui record DNS pubblici un server di test con record DNS pubblici non pubblicati o errati (ad esempio, stai accedendo al server tramite localhosto indirizzo IP, o se stai sovrascrivendo il DNS pubblico utilizzando il tuo hostsfile 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 gethostbynamepuò 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_HOSTe SERVER_NAMEnon 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'];