Come identificare l'indirizzo IP del server in PHP


122

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


2
intendi l'indirizzo IP della richiesta o l'IP della macchina che esegue la tua app?
wosis

Risposte:


175

In questo modo per l'ip del server:

$_SERVER['SERVER_ADDR'];

e questo per il porto

$_SERVER['SERVER_PORT'];

9
No. Su alcuni host condivisi questo restituisce: 1
TheRealChx101

3
Potrebbe non essere corretto a seconda del Load Balancer utilizzato davanti al tuo server web. Vuoi anche l'intestazione X-Forwarded-For in questo scenario: en.wikipedia.org/wiki/X-Forwarded-For
Ligemer

31
Questo NON è l'indirizzo del server! Questo è l'indirizzo che il browser remoto chiama il server, che è sotto il controllo dell'utente remoto. Utilizzare la risposta John Kinvece
Ariel

Questo non fornisce l'ip del server. Per qualche ragione sta dando il mio ip locale
Thomas Williams,

Inoltre non fornisce l'indirizzo del server php-fpm, ma è per il server web associato (nginx, apache). Quindi non sarà corretto per la specifica host mysql-client (utente @ host).
scipilot

105

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.


Perfetto, quello che sto cercando. Grazie John
Frank

6
+1 Questa è l'unica soluzione che funzionerà con la riga di comando.
Adam Elsodaney

2
@andreas Non dovrebbe. Il nome host locale dovrebbe essere nel /etc/hostsfile e sarà veloce, anche se potrebbe esserlo 127.0.0.1. Se deve chiamare DNS, sarà lento come dici tu.
Ariel

+1 ma solo una domanda .. lo provo con xampp su un server locale e restituisce l'ip 192.168etc ma .. dovrebbe essere 127.0.0.1 no ??
Andrea Bori

questo funziona per me, ma alcune macchine mostrano il nome di dominio. come correggere questo problema.
Dharani Dharan

19

per esempio:

$_SERVER['SERVER_ADDR']

quando sei su IIS, prova:

$_SERVER['LOCAL_ADDR']

2
$_SERVER['LOCAL_ADDR']è disponibile solo in IIS quando PHP è in esecuzione come modulo CGI.
Rudi Visser

@rudi_visser funziona anche con fastcgi, ma se ti connetti tramite locahost, ricevi indietro :: 1. Se ti connetti tramite il nome del server o l'ip, ottieni l'ip reale.
starbeamrainbowlabs

@starbeamrainbowlabs FastCGI è CGI :) Intendevo, in contrasto con l'esecuzione come modulo ISAPI, questo è stato scritto prima dell'avvento di FastCGI come piattaforma stabile.
Rudi Visser

@starbeamrainbowlabs tutto ciò che assomiglia a :: 1 è probabilmente un indirizzo IP6
Toby Allen

@TobyAllen Grazie :). La cosa strana è che la mia rete non supporta ipv6, tuttavia il mio server (macchina Windows 7) segnala il suo IP come :: 1, l'indirizzo di loopback ipv6.
starbeamrainbowlabs

13

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


Questa è l'unica opzione che funziona effettivamente quando si eseguono script PHP dalla shell. Domanda: quando ci sono più interfacce attive, come fa questo a decidere quale indirizzo restituire? Ho provato con connessioni ethernet cablate e wireless attive, quindi con solo wireless attivo, e restituisce l'ip wlan entrambe le volte. Buona sceneggiatura, grazie!
Ryan Griggs

In realtà non sa quale restituire. Restituisce semplicemente l'ultima interfaccia inet dall'output di ifconfig, ma ignorando 127.0.0.1. Se hai solo le "solite" interfacce, allora fa un buon lavoro. Probabilmente è più sicuro se specifichi l'interfaccia che vuoi "ifconfig wlan0 | ...". Questo script non è affatto perfetto ma funziona in impostazioni semplici e dimostra come farlo in linea di principio, per essere regolato secondo necessità.
Dom

1
ifconfig | grep 'inet addr' | cut -d ':' -f 2 | awk '{print $ 1}' | grep -vE '^ (192 \ .168 | 10 \. | 172 \ .1 [6789] \. | 172 \ .2 [0-9] \. | 172 \ .3 [01] \. | 127 \. ) 'è la mia ultima revisione di questo. Filtra tutti gli IP locali e ti dà solo gli esterni
Dom

Ho più interfacce di rete così ho fattoifconfig | 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

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.


9

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


5

Se stai usando PHP nella shell bash puoi usare:

$server_name=exec('hostname');

Perché $_SERVER[] SERVER_ADDR, HTTP_HOSTe SERVER_NAMEnon sono impostati.


4

Le risposte precedenti danno tutte $ _SERVER ['SERVER_ADDR']. Questo non funzionerà su alcune installazioni IIS. Se vuoi che funzioni su IIS, utilizza quanto segue:

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

2

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.


2

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']; }

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

1

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


0

Controlla l'array $ _SERVER

echo $_SERVER['SERVER_ADDR'];

1
Questo non trova il "vero IP", trova intestazioni HTTP arbitrarie e non verificate che chiunque può impostare e chiunque può usare per falsificare il proprio IP se lo preferisce. Se il client è dietro un proxy, allora così sia, non fidarti delle intestazioni HTTP. Anche questo non si adatta affatto alla domanda.
inganna

2
Non riesco a capire come questa risposta non si adatti affatto alla domanda. La domanda era: "Come posso identificare l'indirizzo IP del server in PHP?". O l'OP dovrebbe imparare a chiedere meglio, o dovresti imparare a leggere una domanda. Inoltre, se il client è dietro un proxy, sei ancora fregato, non importa cosa provi dal lato server. Uno scenario completamente diverso è quando il server si trova dietro un proxy, poiché puoi controllare con le intestazioni X-FORWARDED-FOR.
Luis Masuelli

@deceze $_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
poncha

@poncha Il mio commento riguardava la revisione originale di questo post.
inganno

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.