在node.js Express中获取当前请求的主机名


175

因此,我在这里可能遗漏了一些简单的东西,但似乎无法找到一种方法来获取向其发送响应的请求对象的主机名。

是否可以从node.js找出用户当前正在访问的主机名?


它在请求标头中。嗯,我是这么认为的,但现在我没有看到它...... hmmmm
jcolebrand

8
CJohn找到了,它在request.headers.host-谢谢!
Jesse

这么想...只是没有将其从ole noggin中抽出来。很高兴您知道了!
jcolebrand 2011年

@Jesse嘿,这实际上是不正确的。request.headers.host不是基于操作系统的服务器的主机名,而是与HTTP请求一起发送的主机头名。如果服务器响应任何HTTP请求而与主机头无关,则该值可能是客户端决定发送的任何值。
罗布·埃文斯

@RobEvans-如果您读完问题的最后一行,那正是我想要的。客户端发送伪造的主机名标头是一个奇怪的用例,我个人不会为尝试支持而担心。
杰西

Answers:


198

如果您在谈论HTTP请求,则可以在以下位置找到请求主机:

request.headers.host

但这取决于传入的请求。

有关更多信息,请访问http://nodejs.org/docs/v0.4.12/api/http.html#http.ServerRequest

如果要查找机器/本机信息,请尝试使用过程对象。


6
啊,太棒了-FWIW,没有请求就无法检测到实际主机,您可以配置多个主机,但这就是我想要的!
Jesse

2
搞定了,谢谢!在Express 4中,我必须执行以下更新:req.headers.host
Gene Bo

5
错误!request.headers.host返回http://127.0.0.1但不返回生产服务器域名
Green

10
req.headers.host由用户提供。我可以在1行python中编写请求,然后向您发送请求,而无需该字段,这会使您的代码崩溃
arboreal84

1
request.headers.host现在已被弃用,您可以使用request.headers.hostname
Syam Danda

281

您可以使用os模块:

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

请参阅http://nodejs.org/docs/latest/api/os.html#os_os_hostname

注意事项:

  1. 如果可以使用IP地址-机器可能有多个网卡,并且除非您指定它,否则节点将侦听所有这些网卡,因此在请求进入之前,您不知道请求来自哪个NIC。

  2. 主机名是DNS问题-不要忘记几个DNS别名可以指向同一台计算机。


6
尽管这样做可以获取计算机的主机名,但是我可以设置一台计算机来回答多个主机,因此这并不准确。
杰西

7
但是,此方法更好-因为您可以在并非总是在HTTP应用程序上下文中运行的模块中使用它
Radagast the Brown

8
重要的是,这个答案回答了所写的问题。如果这不是答案,我认为问题实际上是错误的。
罗布·埃文斯

3
这与hostname命令相关,该命令应该是有效的DNS名称,但不是必需的。例如,在OS X下,您将获得my-machine.localDNS无法解析的名称。要弄清楚机器的外部IP,您需要点击执行此功能服务或使用STUN协议来弄清楚。
tadman 2013年

6
总是准确的。它返回机器的主机名,即问题标题。(此文本提出了另一个问题)。用于传入HTTP请求的主机名是另一回事。
Cheeso

18

这是另一种

req.hostname

Express Docs中了解它。


1
这是正确的答案,因为req.headers.host提供了host:port
ekerner,

req.hostname和req.host之间有什么区别
RayLoveless

1
req.host已弃用。如果使用该命令,express将输出一条警告,指出“已弃用的req.host:使用req.hostname”
bruceczk

8

如果您需要标准域名并且没有HTTP请求,那么在Linux上,您可以使用:

var child_process = require("child_process");

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

1
顺便说一句hostname,Windows中也有命令(但是您不带参数调用它)
jakub.g

7

首先,在提供答案之前,我想先了解一下以下事实:通过信任标头,您正在打开网络钓鱼等安全漏洞的大门。因此,出于重定向目的,在未首先验证URL是否得到授权之前,请勿使用标头中的值。

然后,您的操作系统主机名可能不一定与DNS匹配。实际上,一个IP可能具有多个DNS名称。因此,出于HTTP目的,不能保证在操作系统配置中分配给计算机的主机名是可用的。

我能想到的最佳选择是获取HTTP侦听器公共IP并通过DNS解析其名称。有关dns.reverse更多信息,请参见该方法。但是,请再次注意,一个IP可能具有多个与之关联的名称。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.