Obtenir le nom d'hôte de la demande actuelle dans node.js Express

175

Donc, il me manque peut-être quelque chose de simple ici, mais je n'arrive pas à trouver un moyen d'obtenir le nom d'hôte auquel un objet de requête auquel j'envoie une réponse a été demandé.

Est-il possible de déterminer quel nom d'hôte l'utilisateur visite actuellement à partir de node.js?

Jesse
la source
C'est dans les en-têtes de la demande. Eh bien, je le pensais mais maintenant je ne le vois pas ... hmmmm
jcolebrand
8
CJohn l'a trouvé, c'est dedans request.headers.host- merci!
Jesse
Je le pensais ... je ne le tirais tout simplement pas du vieux noggin. Content que vous l'ayez!
jcolebrand
@Jesse Hey, ce n'est en fait pas correct. request.headers.host n'est pas le nom d'hôte du serveur basé sur le système d'exploitation, c'est le nom d'en-tête d'hôte envoyé avec la requête HTTP. Si votre serveur répond à une requête HTTP quel que soit l'en-tête de l'hôte, cette valeur peut être TOUT ce que le client décide d'envoyer.
Rob Evans
@RobEvans - Si vous lisez la dernière ligne de la question, c'est exactement ce que je cherchais. Un client qui envoie un faux en-tête de nom d'hôte est un cas d'utilisation bizarre que je ne voudrais pas personnellement essayer de prendre en charge.
Jesse

Réponses:

198

Si vous parlez d'une requête HTTP, vous pouvez trouver l'hôte de la requête dans:

request.headers.host

Mais cela dépend d'une demande entrante.

Plus d'informations sur http://nodejs.org/docs/v0.4.12/api/http.html#http.ServerRequest

Si vous recherchez des informations machine / natives, essayez l'objet de processus.

cjohn
la source
6
Ah, génial - FWIW, il n'y aurait aucun moyen de détecter l'hôte réel sans demande, vous pourriez avoir plusieurs hôtes configurés, mais c'est ce que je cherchais!
Jesse
2
J'ai fait le tour, merci! Dans Express 4, je devais faire cette mise à jour: req.headers.host
Gene Bo
5
Faux! request.headers.hostrenvoie http://127.0.0.1mais pas un nom de domaine de serveur de production
Vert
10
req.headers.hostest fourni par l'utilisateur. Je peux créer une requête en 1 ligne de python et vous envoyer une requête sans que ce champ ne fasse planter votre code
arboreal84
1
request.headers.host est maintenant obsolète, à la place vous pouvez utiliser request.headers.hostname
Syam Danda
281

Vous pouvez utiliser le module os:

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

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

Mises en garde:

  1. si vous pouvez travailler avec l'adresse IP - Les machines peuvent avoir plusieurs cartes réseau et à moins que vous ne le spécifiiez, le nœud les écoutera toutes, de sorte que vous ne savez pas sur quelle carte réseau la demande est arrivée, avant qu'elle n'arrive.

  2. Le nom d'hôte est une question DNS - N'oubliez pas que plusieurs alias DNS peuvent pointer vers la même machine.

stephenbez
la source
6
Bien que cela fonctionne pour obtenir le nom d'hôte de la machine, je peux avoir une machine configurée pour répondre à plusieurs hôtes, donc ce ne serait pas exact.
Jesse
7
Cependant, celui-ci est meilleur - car vous pouvez l'utiliser dans des modules qui ne s'exécutent pas toujours dans le contexte de l'application HTTP
Radagast the Brown
8
Et surtout, celui-ci répond à la question telle qu'elle a été écrite. Je pense que la question est en fait erronée si ce n'est pas la réponse.
Rob Evans
3
Cela est en corrélation avec la hostnamecommande qui doit être un nom DNS valide mais qui n'est pas obligatoire. Par exemple, sous OS X, vous obtiendrez des noms comme ceux my-machine.localqui ne peuvent pas être résolus avec DNS. Pour déterminer l'adresse IP externe de la machine, vous devrez accéder à un service qui exécute cette fonction ou utiliser le protocole STUN pour le comprendre.
tadman
6
C'est toujours exact. Il renvoie le nom d'hôte de la machine, qui est le titre de la question posée. (Le texte de celui-ci posait une question différente). Le nom d'hôte utilisé sur une requête HTTP entrante est une autre affaire.
Cheeso
18

Voici une alternative

req.hostname

Lisez à ce sujet dans les documents Express .

Eddie
la source
1
C'est la bonne réponse, comme req.headers.host donne host: port
ekerner
quelle est la différence entre req.hostname et req.host
RayLoveless
1
req.host est obsolète. Si vous utilisez cela, express affichera un avertissement indiquant `` req.host obsolète: utilisez à la place req.hostname ''
bruceczk
8

Si vous avez besoin d'un nom de domaine complet et que vous n'avez pas de requête HTTP, sous Linux, vous pouvez utiliser:

var child_process = require("child_process");

child_process.exec("hostname -f", function(err, stdout, stderr) {
  var hostname = stdout.trim();
});
dricket
la source
1
BTW il y a aussi une hostnamecommande dans Windows (mais vous l'
appelez
7

Tout d'abord, avant de fournir une réponse, j'aimerais être franc sur le fait qu'en faisant confiance aux en-têtes, vous ouvrez la porte à des vulnérabilités de sécurité telles que le phishing. Donc, à des fins de redirection, n'utilisez pas les valeurs des en-têtes sans avoir préalablement validé que l'URL est autorisée.

Ensuite, le nom d'hôte de votre système d'exploitation peut ne pas nécessairement correspondre à celui du DNS. En fait, une adresse IP peut avoir plus d'un nom DNS. Par conséquent, à des fins HTTP, il n'y a aucune garantie que le nom d'hôte attribué à votre machine dans la configuration de votre système d'exploitation soit utilisable.

Le meilleur choix auquel je puisse penser est d'obtenir votre adresse IP publique d'écoute HTTP et de résoudre son nom via DNS. Voir la dns.reverseméthode pour plus d'informations. Mais là encore, notez qu'une adresse IP peut être associée à plusieurs noms.

arboricole84
la source