2011-09-21 20 views
135

Quindi, potrebbe mancare qualcosa di semplice qui, ma non riesco a trovare un modo per ottenere il nome host a cui è stato richiesto un oggetto richiesta a cui sto inviando una risposta a partire dal.Ottieni il nome host della richiesta corrente in node.js Express

È possibile capire quale nome host l'utente sta attualmente visitando da node.js?

+0

È nelle intestazioni di richiesta. Beh, pensavo di sì ma ora non lo vedo ... hmmmm – jcolebrand

+8

CJohn l'ha trovato, è in 'request.headers.host' - grazie! – Jesse

+0

Pensavo così ... semplicemente non lo stavo tirando fuori dalla pipì. Sono felice che tu l'abbia preso! – jcolebrand

risposta

138

Se si sta parlando di una richiesta HTTP, è possibile trovare la richiesta ospitante:

request.headers.host 

Ma che si basa su una richiesta in arrivo.

Altro http://nodejs.org/docs/v0.4.12/api/http.html#http.ServerRequest

Se siete alla ricerca di macchina/informazioni native, provare l'oggetto processo.

+5

Ah, fantastico - FWIW, non ci sarebbe alcun modo per rilevare l'host attuale senza una richiesta, potresti avere più host configurati, ma questo è quello che stavo cercando! – Jesse

+2

Ha fatto il trucco, grazie! In Express 4, ho dovuto fare questo aggiornamento: ** req.headers.host ** – gnB

+2

Sbagliato! 'request.headers.host' restituisce' http: // 127.0.0.1' ma non un nome di dominio del server di produzione – Green

260

È possibile utilizzare il modulo os:

var os = require("os"); 
os.hostname(); 

Vedi http://nodejs.org/docs/latest/api/os.html#os_os_hostname

Avvertenze:

  1. se si può lavorare con l'indirizzo IP - macchine possono avere diverse schede di rete e se non lo specifichi, il nodo ascolterà su tutti loro, quindi non sai su quale NIC è arrivata la richiesta, prima che entri.

  2. Il nome host è un problema DNS - Non dimenticare che diversi alias DNS possono puntare allo stesso computer.

+6

Anche se questo funzionerà per ottenere la macchina nome host, posso avere una macchina configurata per rispondere a più host, quindi questo non sarebbe accurato. – Jesse

+7

Tuttavia questo è meglio - perché è possibile utilizzarlo in moduli che non vengono eseguiti sempre nel contesto dell'app HTTP –

+8

E, soprattutto, questo risponde alla domanda così come è stata scritta. Penso che la domanda sia in realtà sbagliata se questa non è la risposta. –

7

Se avete bisogno di un nome di dominio completo e non hanno alcuna richiesta HTTP, su Linux, è possibile utilizzare:

var child_process = require("child_process"); 

child_process.exec("hostname -f", function(err, stdout, stderr) { 
    var hostname = stdout.trim(); 
}); 
+0

BTW c'è anche il comando 'hostname' in Windows (ma lo si richiama senza parametri) –

4

Prima di tutto, prima di fornire una risposta che vorrei essere in anticipo su il fatto che fidandosi delle intestazioni si sta aprendo la porta alle vulnerabilità della sicurezza come il phishing. Pertanto, per scopi di reindirizzamento, non utilizzare i valori delle intestazioni senza prima aver convalidato l'URL autorizzato.

Quindi, il nome host del sistema operativo potrebbe non corrispondere necessariamente a quello DNS. In effetti, un IP potrebbe avere più di un nome DNS. Pertanto, per scopi HTTP non è garantito che il nome host assegnato alla macchina nella configurazione del sistema operativo sia utilizzabile.

La scelta migliore che posso pensare è di ottenere l'IP pubblico del listener HTTP e risolvere il suo nome tramite DNS. Vedi il metodo dns.reverse per maggiori informazioni. Ma poi, di nuovo, si noti che a un IP potrebbero essere associati più nomi.

Problemi correlati