Obter o nome do host da solicitação atual no node.js Express

175

Portanto, talvez esteja faltando algo simples aqui, mas não consigo encontrar uma maneira de obter o nome do host do qual um objeto de solicitação para o qual estou enviando uma resposta foi solicitado.

É possível descobrir qual nome de host o usuário está visitando atualmente no node.js?

Jesse
fonte
Está nos cabeçalhos da solicitação. Bem, eu pensava assim, mas agora eu não vê-lo ... hmmmm
jcolebrand
8
John encontrou, está dentro request.headers.host- obrigado!
Jesse
Pensei que sim ... simplesmente não estava tirando isso do velho buraco. Que bom que você conseguiu!
precisa saber é o seguinte
@ Jessie Ei, isso realmente não está correto. request.headers.host não é o nome do host do servidor baseado no sistema operacional, é o nome do cabeçalho do host enviado junto com a solicitação HTTP. Se o servidor responder a qualquer solicitação HTTP, independentemente do cabeçalho do host, esse valor poderá ser QUALQUER COISA que o cliente decida enviar.
Rob Evans
@ RobEvans - Se você ler a última linha da pergunta, é exatamente isso que eu estava procurando. Um cliente enviando um cabeçalho de nome de host falso é um caso de uso bizarro que eu não me preocuparia pessoalmente em tentar oferecer suporte.
21713 Jesse

Respostas:

198

Se você estiver falando de uma solicitação HTTP, poderá encontrar o host da solicitação em:

request.headers.host

Mas isso depende de uma solicitação recebida.

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

Se você está procurando informações nativas / da máquina, tente o objeto de processo.

cojo
fonte
6
Ah, incrível - FWIW, não haveria maneira de detectar o host real sem uma solicitação, você poderia ter vários hosts configurados, mas era isso que eu estava procurando!
Jesse
2
Fiz o truque, obrigado! Em Express 4, eu tinha que fazer essa atualização: req.headers.host
Gene Bo
5
Errado! request.headers.hostretornos http://127.0.0.1, mas não um nome de domínio servidor de produção
Verde
10
req.headers.hosté fornecido pelo usuário. Eu posso criar um pedido em 1 linha de python e enviar-lhe um pedido sem que o campo tornando o seu código de acidente
arboreal84
1
request.headers.host agora está obsoleto. Em vez disso, você pode usar request.headers.hostname
Syam Danda 8/16/16
281

Você pode usar o módulo os:

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

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

Ressalvas:

  1. se você puder trabalhar com o endereço IP - as máquinas podem ter várias placas de rede e, a menos que você especifique, o nó escutará todas elas, para que você não saiba em qual placa de rede a solicitação entrou, antes de entrar.

  2. Nome do host é um problema de DNS - Não esqueça que vários aliases de DNS podem apontar para a mesma máquina.

stephenbez
fonte
6
Embora isso funcione para obter o nome do host da máquina, posso ter uma máquina configurada para responder a vários hosts, portanto, isso não seria preciso.
Jesse
7
No entanto, este é o melhor - porque você pode usá-lo em módulos que não são executados sempre dentro contexto de HTTP aplicativo
Radagast, o Castanho
8
E, mais importante, este responde à pergunta como foi escrita. Eu acho que a pergunta está realmente errada se essa não é a resposta.
Rob Evans
3
Isso se correlaciona com o hostnamecomando que deve ser um nome DNS válido, mas não é necessário. Por exemplo, no OS X, você obterá nomes como o my-machine.localque não pode ser resolvido com o DNS. Para descobrir o IP externo da máquina, você precisará acessar um serviço que executa essa função ou usar o protocolo STUN para descobrir.
Tadman
6
Isso é sempre preciso. Ele retorna o nome do host da máquina, que é o título da pergunta. (O texto deste fez uma pergunta diferente). O nome do host usado em uma solicitação HTTP recebida é uma questão diferente.
Cheeso 31/08
18

Aqui está uma alternativa

req.hostname

Leia sobre isso no Express Docs .

Eddie
fonte
1
Esta é a resposta correcta, tal como req.headers.host dá hospedeiro: porta
ekerner
o que é a diferença entre req.hostname e req.host
RayLoveless
1
req.host está obsoleto. Se você usar isso, o express emitirá um aviso dizendo 'req.host obsoleto: use req.hostname'
bruceczk
8

Se você precisar de um nome de domínio totalmente qualificado e não tiver uma solicitação HTTP, no Linux, poderá usar:

var child_process = require("child_process");

child_process.exec("hostname -f", function(err, stdout, stderr) {
  var hostname = stdout.trim();
});
dricket
fonte
1
BTW há também hostnamede comando no Windows (mas você invocá-lo sem parâmetros)
jakub.g
7

Antes de tudo, antes de fornecer uma resposta, gostaria de ser sincero sobre o fato de que, confiando nos cabeçalhos, você está abrindo a porta para vulnerabilidades de segurança, como phishing. Portanto, para fins de redirecionamento, não use valores dos cabeçalhos sem antes validar a URL autorizada.

Em seguida, o nome do host do sistema operacional pode não corresponder necessariamente ao nome DNS. De fato, um IP pode ter mais de um nome DNS. Portanto, para fins de HTTP, não há garantia de que o nome do host atribuído à sua máquina na configuração do sistema operacional seja utilizável.

A melhor opção em que posso pensar é obter o IP público do ouvinte HTTP e resolver seu nome via DNS. Veja o dns.reversemétodo para mais informações. Mas, novamente, observe que um IP pode ter vários nomes associados a ele.

arboreal84
fonte