Rufen Sie den Hostnamen der aktuellen Anforderung in node.js Express ab

175

Möglicherweise fehlt hier etwas Einfaches, aber ich kann anscheinend keinen Weg finden, um den Hostnamen zu erhalten, von dem ein Anforderungsobjekt, an das ich eine Antwort sende, angefordert wurde.

Ist es möglich, aus node.js herauszufinden, welchen Hostnamen der Benutzer gerade besucht?

Jesse
quelle
Es ist in den Anforderungsheadern. Nun, ich dachte schon, aber jetzt sehe ich es nicht ... hmmmm
jcolebrand
8
CJohn hat es gefunden, es ist in request.headers.host- danke!
Jesse
Dachte so ... zog es einfach nicht aus dem alten Noggin heraus. Ich bin froh, dass du es hast!
Jcolebrand
@ Jesse Hey, das ist eigentlich nicht richtig. request.headers.host ist nicht der Hostname des Servers, der auf dem Betriebssystem basiert, sondern der Host-Headername, der zusammen mit der HTTP-Anforderung gesendet wird. Wenn Ihr Server unabhängig vom Host-Header auf eine HTTP-Anfrage antwortet, kann dieser Wert ALLES sein, was der Client senden möchte.
Rob Evans
@RobEvans - Wenn Sie die letzte Zeile der Frage lesen, ist das genau das, wonach ich gesucht habe. Ein Client, der einen gefälschten Hostnamen-Header sendet, ist ein bizarrer Anwendungsfall, über den ich mir persönlich keine Sorgen machen würde.
Jesse

Antworten:

198

Wenn Sie über eine HTTP-Anfrage sprechen, finden Sie den Anforderungshost unter:

request.headers.host

Dies hängt jedoch von einer eingehenden Anfrage ab.

Weitere Informationen finden Sie unter http://nodejs.org/docs/v0.4.12/api/http.html#http.ServerRequest

Wenn Sie nach maschinellen / nativen Informationen suchen, probieren Sie das Prozessobjekt aus.

cjohn
quelle
6
Ah, großartig - FWIW, es gibt keine Möglichkeit, den tatsächlichen Host ohne eine Anfrage zu erkennen. Sie könnten mehrere Hosts konfigurieren, aber das ist, wonach ich gesucht habe!
Jesse
2
Hab den Trick gemacht, danke! In Express 4 musste ich dieses Update durchführen: req.headers.host
Gene Bo
5
Falsch! request.headers.hostgibt zurück, http://127.0.0.1aber keinen Domainnamen des Produktionsservers
Green
10
req.headers.hostwird vom Benutzer bereitgestellt. Ich kann eine Anfrage in 1 Zeile Python erstellen und Ihnen eine Anfrage senden, ohne dass dieses Feld Ihren Code zum Absturz bringt
arboreal84
1
request.headers.host ist jetzt veraltet, stattdessen können Sie request.headers.hostname
Syam Danda
281

Sie können das OS-Modul verwenden:

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

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

Vorsichtsmaßnahmen:

  1. Wenn Sie mit der IP-Adresse arbeiten können - Computer verfügen möglicherweise über mehrere Netzwerkkarten. Wenn Sie diese nicht angeben, überwacht der Knoten alle, sodass Sie nicht wissen, auf welcher Netzwerkkarte die Anforderung eingegangen ist, bevor sie eingeht.

  2. Hostname ist eine DNS-Angelegenheit - Vergessen Sie nicht, dass mehrere DNS-Aliase auf denselben Computer verweisen können.

stephenbez
quelle
6
Obwohl dies funktioniert, um den Hostnamen des Computers abzurufen, kann ich einen Computer so einrichten, dass er auf mehrere Hosts antwortet, sodass dies nicht korrekt ist.
Jesse
7
Dies ist jedoch besser - weil Sie es in Modulen verwenden können, die nicht immer im Kontext der HTTP-App ausgeführt werden
Radagast the Brown
8
Und vor allem beantwortet dieser die Frage, wie sie geschrieben wurde. Ich denke, die Frage ist tatsächlich falsch, wenn dies nicht die Antwort ist.
Rob Evans
3
Dies korreliert mit dem hostnameBefehl, der sollte ein gültiger DNS - Name sein, aber nicht sein erforderlich. Unter OS X erhalten Sie beispielsweise Namen, my-machine.localdie mit DNS nicht aufgelöst werden können. Um die externe IP des Computers herauszufinden, müssen Sie einen Dienst aufrufen, der diese Funktion ausführt, oder das STUN-Protokoll verwenden, um dies herauszufinden.
Tadman
6
Das ist immer richtig. Es gibt den Hostnamen des Computers zurück, wie der Titel der gestellten Frage lautet. (Der Text dieses Artikels stellte eine andere Frage). Der Hostname, der für eine eingehende HTTP-Anforderung verwendet wird, ist eine andere Sache.
Cheeso
18

Hier ist eine Alternative

req.hostname

Lesen Sie darüber in den Express-Dokumenten .

Eddie
quelle
1
Dies ist die richtige Antwort, da req.headers.host host: port
ekerner
Was ist der Unterschied zwischen req.hostname und req.host
RayLoveless
1
req.host ist veraltet. Wenn Sie dies verwenden, gibt Express eine Warnung mit der Meldung "
Veralteter
8

Wenn Sie einen vollständig qualifizierten Domänennamen benötigen und keine HTTP-Anforderung haben, können Sie unter Linux Folgendes verwenden:

var child_process = require("child_process");

child_process.exec("hostname -f", function(err, stdout, stderr) {
  var hostname = stdout.trim();
});
Dricket
quelle
1
Übrigens gibt es auch einen hostnameBefehl in Windows (aber Sie rufen ihn ohne Parameter auf)
jakub.g
7

Bevor ich eine Antwort gebe, möchte ich zunächst klarstellen, dass Sie durch das Vertrauen in Header die Tür zu Sicherheitslücken wie Phishing öffnen. Verwenden Sie daher für Umleitungszwecke keine Werte aus Headern, ohne vorher zu überprüfen, ob die URL autorisiert ist.

Dann stimmt der Hostname Ihres Betriebssystems möglicherweise nicht unbedingt mit dem DNS-Hostnamen überein. Tatsächlich kann eine IP mehr als einen DNS-Namen haben. Für HTTP-Zwecke kann daher nicht garantiert werden, dass der Ihrem Computer in Ihrer Betriebssystemkonfiguration zugewiesene Hostname verwendet werden kann.

Die beste Wahl, die ich mir vorstellen kann, ist, die öffentliche IP-Adresse Ihres HTTP-Listeners abzurufen und seinen Namen über DNS aufzulösen. dns.reverseWeitere Informationen finden Sie in der Methode. Beachten Sie jedoch auch, dass einer IP möglicherweise mehrere Namen zugeordnet sind.

arboreal84
quelle