Ottieni il nome host della richiesta corrente in node.js Express


175

Quindi, qui potrei mancare qualcosa di semplice, 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.

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


È nelle intestazioni della richiesta. Beh, l'ho pensato, ma ora non lo vedo ... hmmmm
jcolebrand,

8
CJohn l'ha trovato, è dentro request.headers.host- grazie!
Jesse,

Pensato di sì ... semplicemente non lo stava tirando fuori dall'ole noggin. Sono contento che tu l'abbia ottenuto!
jcolebrand,

@Jesse Ehi, in realtà non è corretto. request.headers.host non è il nome host del server basato sul sistema operativo, è il nome dell'intestazione host inviato insieme alla richiesta HTTP. Se il tuo server risponde a qualsiasi richiesta HTTP indipendentemente dall'intestazione host, quel valore potrebbe essere QUALSIASI COSA che il client decide di inviare.
Rob Evans,

@RobEvans - Se leggi l'ultima riga della domanda, è esattamente quello che stavo cercando. Un client che invia un'intestazione di nome host falso è un bizzarro caso d'uso che non mi preoccuperei personalmente di provare a supportare.
Jesse,

Risposte:


198

Se stai parlando di una richiesta HTTP, puoi trovare l'host della richiesta in:

request.headers.host

Ma ciò si basa su una richiesta in arrivo.

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

Se stai cercando informazioni macchina / native, prova l'oggetto processo.


6
Ah, fantastico - FWIW, non ci sarebbe modo di rilevare l'host reale 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 eseguire questo aggiornamento: req.headers.host
Gene Bo,

5
Sbagliato! request.headers.hostrestituisce http://127.0.0.1ma non un nome di dominio del server di produzione
Green,

10
req.headers.hostè fornito dall'utente. Posso creare una richiesta in 1 riga di Python e inviarti una richiesta senza quel campo che fa crashare il tuo codice
arboreal84

1
request.headers.host ora è deprecato, invece puoi usare request.headers.hostname
Syam Danda

281

È 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 riesci a lavorare con l'indirizzo IP - Le macchine possono avere diverse schede di rete e, a meno che non lo specifichi, il nodo ascolterà su tutte, quindi non sai su quale scheda NIC è arrivata la richiesta, prima che arrivi.

  2. Il nome host è una questione DNS: non dimenticare che diversi alias DNS possono puntare allo stesso computer.


6
Anche se questo funzionerà per ottenere il nome host della macchina, posso avere una macchina impostata per rispondere a più host, quindi non sarebbe accurato.
Jesse,

7
Tuttavia, questo è meglio - perché puoi usarlo in moduli che non funzionano sempre all'interno del contesto dell'app HTTP
Radagast the Brown

8
E soprattutto questo risponde alla domanda così come è stata scritta. Penso che la domanda sia effettivamente sbagliata se questa non è la risposta.
Rob Evans,

3
Ciò è correlato al hostnamecomando che dovrebbe essere un nome DNS valido ma che non è necessario. Ad esempio, in OS X otterrai nomi come quelli my-machine.localche non sono risolvibili con DNS. Per capire l'IP esterno della macchina dovrai colpire un servizio che esegue questa funzione o usare il protocollo STUN per capirlo.
Tadman,

6
Questo è sempre accurato. Restituisce il nome host della macchina, che è il titolo della domanda. (Il testo di questo ha posto una domanda diversa). Il nome host utilizzato su una richiesta HTTP in arrivo è diverso.
Cheeso,

18

Ecco un supplente

req.hostname

Leggi a riguardo in Express Docs .


1
Questa è la risposta corretta, come req.headers.host fornisce host: port
ekerner,

qual è la differenza tra req.hostname e req.host
RayLoveless

1
req.host è obsoleto. Se lo usi, express emetterà un avviso che dice 'req.host deprecato: usa invece req.hostname'
bruceczk

8

Se hai bisogno di un nome di dominio completo e non hai una richiesta HTTP, su Linux puoi usare:

var child_process = require("child_process");

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

1
A proposito c'è anche il hostnamecomando in Windows (ma lo invochi senza parametri)
jakub.g

7

Prima di tutto, prima di fornire una risposta vorrei essere sincero sul fatto che fidandoti delle intestazioni stai aprendo la porta a vulnerabilità della sicurezza come il phishing. Pertanto, ai fini del reindirizzamento, non utilizzare i valori delle intestazioni senza prima convalidare 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 esiste alcuna garanzia che il nome host assegnato al computer nella configurazione del sistema operativo sia utilizzabile.

La scelta migliore che mi viene in mente è quella di ottenere l'IP pubblico del tuo listener HTTP e risolverne il nome tramite DNS. Vedi il dns.reversemetodo per maggiori informazioni. Ma poi, ancora una volta, nota che a un IP potrebbero essere associati più nomi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.