2011-09-21 55 views
135

所以,我可能会在这里丢失一些简单的东西,但我似乎无法找到一种方法来获取我发送响应的请求对象的主机名被请求从。在node.js中获取当前请求的主机名Express

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

+0

它在请求头部。嗯,我认为是这样,但现在我没有看到它...嗯 – jcolebrand

+8

CJohn发现它,它在'request.headers.host' - 谢谢! – Jesse

+0

这么认为...只是没有把它拉出来。很高兴你得到它! – jcolebrand

回答

138

如果你在谈论一个HTTP请求,你可以找到在请求主持人:

request.headers.host 

但是,这依赖于传入的请求。

更多的http://nodejs.org/docs/v0.4.12/api/http.html#http.ServerRequest

如果你正在寻找机/本地信息,尝试的过程对象。

+5

啊,太棒了 - FWIW,没有办法可以检测到没有请求的实际主机,你可以配置多个主机,但这就是我一直在寻找的东西! – Jesse

+2

窍门,谢谢!在Express 4中,我必须执行此更新:** req.headers.host ** – gnB

+2

错误! 'request.headers.host'返回'http:// 127.0.0.1',但不包含生产服务器域名 – Green

260

您可以使用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

尽管这样做可以使计算机主机名,我可以设置一台机器来回答多个主机,所以这不太准确。 – Jesse

+7

然而,这一个更好 - 因为你可以在模块中使用它,它不会总是在HTTP应用程序的上下文中运行 –

+8

重要的是,这个问题在写入时会回答问题。如果这不是答案,我认为这个问题实际上是错误的。 –

7

如果你需要一个完全合格的域名,并没有HTTP请求,在Linux上,你可以使用:

var child_process = require("child_process"); 

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

顺便说一句,在Windows中还有'hostname'命令(但是不带参数调用它) –

4

首先,提供一个答案之前,我想请事先通知事实上,通过信任标题,您可以打开网络钓鱼等安全漏洞。因此,为了重定向的目的,不要首先验证URL是否经过授权才能使用头中的值。

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

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