5 votos

¿Por qué los navegadores no pueden resolver localhost?

Tengo un programa en mi máquina escuchando en el puerto 8080 para responder a las solicitudes HTTP. Pero cuando intento ir a http://localhost:8080/ en un navegador...

Chrome dice:

La página de localhost no está funcionando

Localhost no envió ningún dato. ERR_EMPTY_RESPONSE

Firefox redirige la solicitud a www.localhost.com:8080 lo cual, por supuesto, no es correcto. Mis investigaciones sugieren que esto se debe a que no puede encontrar localhost.

Safari dice que no puede abrir la página porque "el servidor cerró inesperadamente la conexión".

Sin embargo, si voy a http://127.0.0.1:8080 la página carga correctamente.

Por lo tanto, parecería que por alguna razón OS X no está resolviendo correctamente localhost a 127.0.0.1. Si intento hacer ping localhost desde la línea de comandos, funciona, pero según entiendo, la resolución de nombres funciona de manera diferente en diferentes lugares.

He leído varios problemas donde localhost no se resuelve, por ejemplo, desde ping, pero no estoy teniendo ese problema. Todos los casos donde localhost no funcionaba en el navegador parecen no tener soluciones relacionadas con el problema real que estoy teniendo. También he visto lugares donde mencionan que localhost funciona en el navegador, por lo que me pregunto qué estoy haciendo mal aquí.

Desde comentarios
Si pruebo la dirección IPv6 para localhost http://[::1]:8080/ entonces obtengo los mismos errores que al usar localhost.

0 votos

¿Firefox redirige una URL "http://" correctamente formada?

0 votos

¿Cuál es tu servidor y qué muestran sus registros?

0 votos

@Allan sí, lo hace

8voto

klanomath Puntos 19587

Primero verifica la resolución de nombres con el resolutor del sistema:

dscacheutil -q host -a name localhost

Si obtienes una salida como:

name: localhost
ipv6_address: ::1

name: localhost
ip_address: 127.0.0.1

el resolutor del sistema funciona correctamente.

Detén tu aplicación node.js, crea un servidor node.js simple utilizando este archivo con un nombre arbitrario (por ejemplo, multiserver.js):

var http = require('http');
function handler(req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hola Mundo\n');
};
http.createServer(handler).listen(3000, '127.0.0.1');
http.createServer(handler).listen(3001, 'localhost');
http.createServer(handler).listen(3002, '192.168.0.5');
http.createServer(handler).listen(3003, 'host.example.com');
http.createServer(handler).listen(3004, 'LocalHostName.local');

(reemplaza la IP del servidor :3002 por una IP de tu host (ifconfig), el host.example.com del servidor :3003 por la salida de echo $HOSTNAME y LocalHostName por la salida de scutil --get LocalHostName)

y arráncalo con

node ../multiserver.js

Ahora prueba tu "multiservidor" con Google Chrome ingresando a http://name:port (no olvides anteponer http://).

Los dos primeros puertos deberían funcionar con ambos "nombres" (127.0.0.1/localhost). Por lo tanto, ingresar a cualquiera de los siguientes enlaces: http://127.0.0.1:3000, http://127.0.0.1:3001, http://localhost:3000 o http://localhost:3001 debería mostrar todos "Hola Mundo".

También verifica las nueve permutaciones de los siguientes tres puertos y nombres (por ejemplo, http://LocalHostName.local:3002 or http://192.168.0.5:3004) los cuales también deberían mostrar todos "Hola Mundo" si el nombre de host/DNS están configurados correctamente.

Si todo esto funciona, tu aplicación express/node.js tiene un error.

0 votos

Definitivamente parece ser algo con mi aplicación... aunque ahora estoy llamando a createServer exactamente como lo haces en mi aplicación (sin usar express, básicamente eliminé todo lo de HTTP para que coincida con tu ejemplo) y aún no responde en localhost mientras que tu ejemplo sí lo hace.

0 votos

Cuando intento dscacheutil -q host -a name localhost no obtengo nada. Si intento dscacheutil -q host -a name apple.com obtengo un resultado sin embargo.

-2voto

yoliho Puntos 340

No soy un programador de Javascript, así que si alguien tiene mejores enlaces, por favor edítalos.

El problema es que tu servidor solo está escuchando en la dirección IPv4 y debería también estar escuchando en la dirección IPv6.

Cómo cambiar tu servidor es un tema que no corresponde en Ask Different, ya que requiere cambios de código. Esta respuesta de StackOverflow podría ayudar.

Apple ha cambiado macOS desde El Capitan para buscar direcciones IPv6 en preferencia a las más antiguas, como se informa aquí

Puedes probar el servidor directamente en http://[::1]:8080

En el peor caso podrías eliminar el alias de localhost a ::1, pero sería mejor si no puedes hacer nada, simplemente usa http://127.0.0.1:8080 en tus pruebas

-2voto

Robocide Puntos 1084

Tal vez intenta usar el puerto 80. Dijiste que 127.0.0.1:8080 funciona, así que me pregunto si 127.0.0.1 también funciona. Creo que si escribes localhost se resolverá a localhost:80 donde no hay nada escuchando.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X