Respuestas:
Así para la ip del servidor:
$_SERVER['SERVER_ADDR'];
y esto para el puerto
$_SERVER['SERVER_PORT'];
John K
lugar
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.
/etc/hosts
archivo y será rápido, aunque podría serlo 127.0.0.1
. Si tiene que llamar al DNS, será lento como dices.
por ejemplo:
$_SERVER['SERVER_ADDR']
cuando esté en IIS, intente:
$_SERVER['LOCAL_ADDR']
$_SERVER['LOCAL_ADDR']
solo está disponible en IIS cuando PHP se ejecuta como un módulo CGI.
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? )
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\.'
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) gethostbyname
saltará directamente a buscar la dirección de Yahoo.com en lugar de la del servidor local.
Además, debido a que gethostbyname
recurre 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 localhost
dirección IP, o si está anulando el DNS público utilizando su hosts
archivo 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 gethostbyname
puede 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.
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);
?>
Verifique la matriz $ _SERVER
echo $_SERVER['SERVER_ADDR'];
Si está usando PHP en bash shell, puede usar:
$server_name=exec('hostname');
Porque $_SERVER[] SERVER_ADDR
, HTTP_HOST
y SERVER_NAME
no están configurados.
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.
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']; }
Verifique la matriz $ _SERVER
echo $_SERVER['SERVER_ADDR'];
$_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
Me gusta esto:
$_SERVER['SERVER_ADDR'];