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

Jes*_*sse 154 hostname node.js express

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

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

ste*_*bez 267

你可以使用os模块:

var os = require("os");
os.hostname();
Run Code Online (Sandbox Code Playgroud)

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

注意事项:

  1. 如果你可以使用IP地址 - 机器可能有几个网卡,除非你指定它,节点将监听所有这些,所以你不知道请求进入哪个网卡.

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

  • 重要的是,这个问题回答了问题.如果这不是答案,我认为问题实际上是错误的. (8认同)
  • 然而,这个更好 - 因为您可以在不在HTTP应用程序的上下文中运行的模块中使用它 (7认同)
  • 虽然这可以用来获取机器的主机名,但我可以设置机器来回答多个主机,因此这不准确. (6认同)
  • 这总是*准确.它返回机器的主机名,这就是问题的标题.(这一个的文字问了一个不同的问题).传入HTTP请求中使用的主机名是另一回事. (6认同)
  • 这与`hostname`命令相关,*host*应该是有效的DNS名称,但不是必须的.例如,在OS X下,你会得到像my-machine.local这样的名字,它不能用DNS解析.要弄清楚机器的外部IP,您需要点击[执行此功能的服务](http://ipchicken.com/)或使用[STUN协议](http://en.wikipedia.org/wiki/STUN)弄清楚了. (3认同)
  • @BT对于"错误"的阅读解释不佳,误导,容易解释.请记住,原始问题与当前显示的问题不同.它是后来编辑的.考虑到当时的问题,这个答案是正确的,这个问题后来发生了变化. (2认同)

cjo*_*ohn 176

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

request.headers.host
Run Code Online (Sandbox Code Playgroud)

但这取决于传入的请求.

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

如果您正在寻找机器/本机信息,请尝试过程对象.

  • `req.headers.host`由用户提供.我可以在1行python中创建一个请求,并在没有该字段的情况下向您发送请求,使您的代码崩溃 (8认同)
  • 啊,太棒了 - FWIW,如果没有请求就没有办法检测到实际的主机,你可以配置多个主机,但这就是我想要的! (5认同)
  • 错误!`request.headers.host`返回`http:// 127.0.0.1`但不是生产服务器域名 (3认同)
  • request.headers.host 现在已弃用,您可以使用 request.headers.hostname (3认同)
  • 诀窍,谢谢!在Express 4中,我不得不做这个更新:**req.headers.host** (2认同)

Edd*_*die 12

这是另一种选择

req.hostname
Run Code Online (Sandbox Code Playgroud)

Express Docs中阅读它.

  • 这是正确的答案,因为 req.headers.host 给出了 host:port (2认同)

小智 7

如果您需要完全限定的域名且没有HTTP请求,则可以在Linux上使用:

var child_process = require("child_process");

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


arb*_*l84 5

首先,在提供答案之前,我想提前了解一下这样一个事实:通过信任标题,您正在打开网络钓鱼等安全漏洞的大门.因此,对于重定向目的,如果没有首先验证URL是否经过授权,请不要使用标头中的值.

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

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