Perché i browser non possono risolvere localhost?

2

Ho un programma sulla mia macchina in ascolto sulla porta 8080 per rispondere alle richieste HTTP. Ma quando provo ad andare a http://localhost:8080/ in un browser ...

Chrome dice:

The localhost page isn’t working

localhost didn’t send any data. ERR_EMPTY_RESPONSE

Firefox reindirizza la richiesta a www.localhost.com:8080 che ovviamente non è corretta. La mia ricerca suggerisce che lo sta facendo perché non riesce a trovare localhost.

Safari dice che non è possibile aprire la pagina perché "il server ha interrotto inaspettatamente la connessione."

Tuttavia, se vado a http://127.0.0.1:8080 la pagina si carica correttamente.

Pertanto, sembrerebbe che per qualche ragione OS X non risolva correttamente localhost su 127.0.0.1. Se provo a ping localhost dalla riga di comando, funziona, ma la mia comprensione è che la risoluzione dei nomi funziona diversamente in luoghi diversi.

Ho letto vari problemi in cui localhost non risolve, ad es. dal ping, ma non ho questo problema. Tutti i casi in cui localhost non funzionava nel browser sembrano non avere soluzioni relative al problema reale che sto avendo. Ho anche visto luoghi in cui le persone hanno menzionato che localhost fa funziona nel browser, quindi mi sto chiedendo cosa sto facendo male qui.

Dai commenti
Se provo l'indirizzo IPv6 per localhost http://[::1]:8080/ , ricevo gli stessi errori dell'utilizzo di localhost.

    
posta Michael 18.01.2017 - 20:23
fonte

3 risposte

4

Prima verifica la risoluzione dei nomi con il risolutore di sistema:

dscacheutil -q host -a name localhost

Se ottieni un risultato come:

name: localhost
ipv6_address: ::1

name: localhost
ip_address: 127.0.0.1

il risolutore di sistema funziona correttamente.

Interrompi l'app node.js, crea un semplice server node.js utilizzando questo file con un nome arbitrario (ad esempio multiserver.js):

var http = require('http');
function handler(req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\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');

(sostituisci l'IP del server: 3002 con un IP del tuo host ( ifconfig ), il host.example.com del server: 3003 dall'output di echo $HOSTNAME e LocalHostName dall'output di scutil --get LocalHostName )

e avvialo con

node ../multiserver.js

Ora prova il tuo "multiserver" con Google Chrome inserendo link (non dimenticare di anteporre link ).

Le prime due porte dovrebbero funzionare con entrambi i "nomi" (127.0.0.1/localhost). Quindi, inserendo il link , link , link o link dovrebbero produrre "Hello World".

Controlla anche le nove permutazioni delle tre porte e nomi seguenti (ad es. link o link ) che dovrebbe anche restituire" Hello World "se il nome host / DNS sono impostati correttamente.

Se tutto funziona, l'app express / node.js è difettosa.

    
risposta data 20.01.2017 - 19:15
fonte
-1

Non sono un programmatore Javascript, quindi se qualcuno ha collegamenti migliori, per favore modifica.

Il problema è che il tuo server è in ascolto solo sull'indirizzo IPv4 e dovrebbe essere in ascolto anche sull'indirizzo IPv6.

Come scoraggiare il tuo server è fuori tema per Ask Different in quanto richiede modifiche al codice. Questa risposta di StackOverflow potrebbe essere d'aiuto.

Apple ha cambiato macOS da El Capitan in poi per cercare gli indirizzi IPv6 in preferenza a quelli più vecchi come riportato qui

Puoi testare il server direttamente su http://[::1]:8080

Nel peggiore dei casi puoi rimuovere l'alias di localhost per: 1 ma meglio se non puoi fare nulla quindi usa http://127.0.0.1:8080 nei tuoi test

    
risposta data 20.01.2017 - 19:03
fonte
-2

Forse prova ad usare la porta 80. Hai detto che 127.0.0.1:8080 funziona, quindi mi chiedo se anche 127.0.0.1 funzioni. Penso che se digiti localhost verrà risolto in localhost:80 in cui nulla è in ascolto.

    
risposta data 20.01.2017 - 00:31
fonte

Leggi altre domande sui tag