Cómo identificar la dirección IP del servidor en PHP


122

¿Cómo puedo identificar la dirección IP del servidor en PHP?


2
¿Te refieres a la dirección IP de la solicitud o la IP de la máquina que ejecuta tu aplicación?
wosis

Respuestas:


175

Así para la ip del servidor:

$_SERVER['SERVER_ADDR'];

y esto para el puerto

$_SERVER['SERVER_PORT'];

9
No. En algunos hosts compartidos, esto devuelve :: 1
TheRealChx101

3
Esto podría ser incorrecto según el Load Balancer que se esté utilizando frente a su servidor web. También desea el encabezado X-Fordered-For en este escenario: en.wikipedia.org/wiki/X-Fordered-For
Ligemer

31
¡Esta NO es la dirección del servidor! Esta es la dirección que el navegador remoto llama al servidor, que está bajo el control del usuario remoto. Use la respuesta de en su John Klugar
Ariel

Esto no da la IP del servidor. Por alguna razón, está dando mi IP local
Thomas Williams

Tampoco da la dirección del servidor php-fpm, pero es para el servidor web asociado (nginx, apache). Por lo tanto, no será correcto para la especificación de host mysql-client (usuario @ host).
scipilot

105

Si está utilizando PHP versión 5.3 o superior, puede hacer lo siguiente:

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

Esto funciona bien cuando se ejecuta un script independiente, no se ejecuta a través del servidor web.


Perfecto, lo que busco. Gracias John
Frank

6
+1 Esta es la única solución que funcionará con la línea de comando.
Adam Elsodaney

2
@andreas No debería. El nombre de host local debe estar en el /etc/hostsarchivo y será rápido, aunque podría serlo 127.0.0.1. Si tiene que llamar al DNS, será lento como dices.
Ariel

+1 pero solo una pregunta ... lo intento con xampp en un servidor local y devuelve la ip 192.168etc pero ... debería ser 127.0.0.1 no ??
Andrea Bori

esto funciona para mí, pero alguna máquina muestra el nombre de dominio. cómo solucionar este problema.
Dharani Dharan

19

por ejemplo:

$_SERVER['SERVER_ADDR']

cuando esté en IIS, intente:

$_SERVER['LOCAL_ADDR']

2
$_SERVER['LOCAL_ADDR']solo está disponible en IIS cuando PHP se ejecuta como un módulo CGI.
Rudi Visser

@rudi_visser también funciona con fastcgi, pero si te conectas a través de locahost, obtienes :: 1 en su lugar. Si se conecta a través del nombre o la IP del servidor, recuperará la IP real.
starbeamrainbowlabs

@starbeamrainbowlabs FastCGI es CGI :) Me refiero a que, en contraste con la ejecución como módulo ISAPI, esto fue escrito antes de la gran llegada de FastCGI como plataforma estable.
Rudi Visser

@starbeamrainbowlabs cualquier cosa que se parezca a :: 1 es probablemente una dirección IP6
Toby Allen

@TobyAllen Gracias :). Lo extraño es que mi red no es compatible con ipv6, sin embargo, mi servidor (máquina con Windows 7) informa su IP como :: 1, la dirección de loopback ipv6.
starbeamrainbowlabs

13

Vine a esta página buscando una forma de obtener mi propia dirección IP, no la de la máquina remota que se conecta a mí.

Esto no funcionará para una máquina con Windows.

Pero en caso de que alguien busque lo que estaba buscando:

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

(Adaptado descaradamente de ¿Cómo obtengo la dirección IP principal de la máquina local en Linux y OS X? )


Esta es la única opción que realmente funciona cuando se ejecutan scripts PHP desde el shell. Pregunta: cuando hay varias interfaces activas, ¿cómo decide qué dirección devolver? Probé con conexiones ethernet cableadas e inalámbricas activas, y luego solo con conexión inalámbrica activa, y devuelve la ip wlan en ambas ocasiones. Buen guion, gracias!
Ryan Griggs

En realidad, no sabe cuál devolver. Simplemente devuelve la última interfaz inet de la salida de ifconfig, pero ignorando 127.0.0.1. Si solo tiene las interfaces "habituales", entonces hace un trabajo bastante bueno. Probablemente sea más seguro si especifica la interfaz que desea "ifconfig wlan0 | ...". Este script no es perfecto en absoluto, pero funciona en configuraciones simples y demuestra cómo hacer esto en principio, para ajustarlo según sea necesario.
Dom

1
ifconfig | grep 'inet addr' | cortar -d ':' -f 2 | awk '{imprimir $ 1}' | grep -vE '^ (192 \ .168 | 10 \. | 172 \ .1 [6789] \. | 172 \ .2 [0-9] \. | 172 \ .3 [01] \. | 127 \. ) 'es mi última revisión de esto. Filtra todos los ips locales y solo le brinda externos
Dom

Tengo varias interfaces de red, así que lo hiceifconfig | 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

Ninguna de las respuestas más votadas devolverá de manera confiable la dirección pública del servidor. Generalmente$_SERVER['SERVER_ADDR'] será correcto, pero si accede al servidor a través de una VPN, probablemente devolverá la dirección de red interna en lugar de una dirección pública, e incluso cuando no estén en la misma red, algunas configuraciones simplemente estarán en blanco o tendrán alguna otra especificada. valor.

Del mismo modo, hay escenarios en los $host= gethostname(); $ip = gethostbyname($host);que no devolverán los valores correctos porque se basan en DNS (ya sea en registros externos o configurados internamente) y en la configuración del nombre de host del servidor para extrapolar la dirección IP del servidor. Ambos pasos son potencialmente defectuosos. Por ejemplo, si el nombre de host del servidor está formateado como un nombre de dominio (es decir HOSTNAME=yahoo.com), entonces (al menos en mi configuración php5.4 / Centos6) gethostbynamesaltará directamente a buscar la dirección de Yahoo.com en lugar de la del servidor local.

Además, debido a que gethostbynamerecurre a los registros DNS públicos, un servidor de prueba con registros DNS públicos no publicados o incorrectos (por ejemplo, está accediendo al servidor por una localhostdirección IP, o si está anulando el DNS público utilizando su hostsarchivo local ), entonces ' No recuperará ninguna dirección IP (solo devolverá el nombre de host) o, lo que es peor, devolverá la dirección incorrecta especificada en los registros DNS públicos, si existe, o si hay un comodín para el dominio.

Dependiendo de la situación, también puede probar un tercer enfoque haciendo algo como esto:

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

Esto tiene sus propias fallas (se basa en un sitio de terceros específico y podría haber configuraciones de red que enruten las conexiones salientes a través de un host o proxy diferente) y gethostbynamepuede ser lento. Honestamente, no estoy seguro de qué enfoque será el correcto con mayor frecuencia, pero la lección que debe tomarse en serio es que los escenarios / configuraciones específicas darán como resultado resultados incorrectos para todos estos enfoques ... así que, si es posible, verifique que el enfoque que está usar está devolviendo los valores esperados.


9

Esto es lo que podría usar como una adaptación de los ejemplos anteriores sin preocuparse por curl instalado en su servidor.

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

Si está usando PHP en bash shell, puede usar:

$server_name=exec('hostname');

Porque $_SERVER[] SERVER_ADDR, HTTP_HOSTy SERVER_NAMEno están configurados.


4

Todas las respuestas anteriores dan $ _SERVER ['SERVER_ADDR']. Esto no funcionará en algunas instalaciones de IIS. Si desea que esto funcione en IIS, utilice lo siguiente:

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

2

Encontré que esto me funcionaba: GetHostByName ("");

Ejecutando XAMPP v1.7.1 en Windows 7 con servidor web Apache. Desafortunadamente, solo da la dirección IP de mi puerta de enlace.


2

Acabo de crear un script simple que traerá de vuelta $ _SERVER ['REMOTE_ADDR'] y $ _SERVER ['SERVER_ADDR'] en IIS para que no tenga que cambiar todas las variables. Simplemente pegue este texto en su archivo php que se incluye en cada página.

/** 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

Es posible que deba usar $HTTP_SERVER_VARS['server_ADDR']si no obtiene nada de las respuestas anteriores y si está usando una versión anterior de PHP


0

Verifique la matriz $ _SERVER

echo $_SERVER['SERVER_ADDR'];

1
Eso no encuentra la "IP real", encuentra encabezados HTTP arbitrarios y no verificados que cualquiera puede establecer y cualquiera puede usar para falsificar su IP si los prefiere. Si el cliente está detrás de un proxy, que así sea, no confíe en ningún encabezado HTTP. Esto tampoco se ajusta a la pregunta en absoluto.
diciembre

2
No puedo imaginar cómo esta respuesta no se ajusta en absoluto a la pregunta. La pregunta era: "¿Cómo puedo identificar la dirección IP del servidor en PHP?". El OP debería aprender a preguntar mejor, o debería aprender a leer una pregunta. Además, si el cliente está detrás de un proxy, todavía está jodido sin importar lo que intente desde el lado del servidor. Un escenario totalmente diferente es cuando el servidor está detrás de un proxy, ya que puede verificar con los encabezados X-FORWARDED-FOR.
Luis Masuelli

@deceze $_SERVER["SERVER_ADDR"]no tiene nada que ver con los encabezados HTTP. Esto lo llena el software del servidor, todo lo relacionado con HTTP en $ _SERVER tiene el prefijo HTTP_. php.net/manual/en/reserved.variables.server.php
poncha

@poncha Mi comentario se refiere a la revisión original de esta publicación.
diciembre

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.