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

在node.js Express中获取当前请求的主机名,node.js,express,hostname,Node.js,Express,Hostname,因此,我可能在这里遗漏了一些简单的东西,但我似乎找不到一种方法来获取请求对象的主机名,我正在向该请求对象发送响应 是否可以从node.js中找出用户当前访问的主机名?如果您谈论的是HTTP请求,您可以在以下位置找到请求主机: request.headers.host 但这取决于传入的请求 更多 如果要查找计算机/本机信息,请尝试process对象。您可以使用操作系统模块: var os = require("os"); os.hostname(); 看 注意事项: 如果您可以使用IP地址--

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


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

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

request.headers.host
但这取决于传入的请求

更多


如果要查找计算机/本机信息,请尝试process对象。

您可以使用操作系统模块:

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

注意事项:

  • 如果您可以使用IP地址-- 机器可能有多个网卡,除非您指定它,否则节点将侦听所有网卡,因此在请求传入之前,您不知道该请求是在哪个NIC上传入的

  • 主机名是一个DNS问题-- 不要忘记几个DNS别名可以指向同一台机器


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

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

    首先,在给出答案之前,我想先说明一个事实,即通过信任头部,您正在打开安全漏洞(如钓鱼)的大门。因此,出于重定向目的,在未首先验证URL是否被授权之前,不要使用来自标题的值

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

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

    这里有一个备用名称

    req.hostname
    


    请阅读。

    请求标题中的相关内容。我想是的,但现在我看不出来。。。hmmmmCJohn找到了,它在
    请求.标题.主机中
    -谢谢!我想是的。。。只是没有把它从奥勒诺金身上拿出来。很高兴你拿到了@杰西,嘿,这其实是不对的。request.headers.host不是基于操作系统的服务器主机名,而是随HTTP请求一起发送的主机头名称。如果您的服务器响应任何HTTP请求,而不考虑主机头,则该值可能是客户端决定发送的任何内容。@robvans-如果您阅读了问题的最后一行,这正是我要查找的内容。客户端发送假主机名头是一个奇怪的用例,我个人不会担心尝试支持它。啊,真棒-FWIW,如果没有请求,就无法检测实际主机,您可以配置多个主机,但这正是我想要的!成功了,谢谢!在Express 4中,我必须执行以下更新:req.headers.hostError<代码>请求.headers.host返回
    http://127.0.0.1
    但不是由用户提供的生产服务器域名
    req.headers.host
    。我可以用一行python编写一个请求,并向您发送一个请求,而不需要该字段使您的代码crashrequest.headers.host现在不推荐使用,相反,您可以使用request.headers.hostname虽然这可以获取机器的主机名,但我可以将一台机器设置为应答多个主机,所以这并不准确,但是这一个更好,因为你可以在模块中使用它,而这些模块并不总是在HTTP的上下文中运行,重要的是,这一个在编写时回答了这个问题。如果这不是答案,我认为这个问题实际上是错误的。这与
    hostname
    命令相关,该命令应该是一个有效的DNS名称,但不是必需的。例如,在OSX下,您将获得像
    my machine.local
    这样的名称,这是DNS无法解析的。要计算机器的外部IP,您需要点击a或使用来计算。这总是准确的。它返回机器的主机名,即问题的标题。(这篇文章的正文提出了一个不同的问题)。传入HTTP请求上使用的主机名是另一回事。顺便说一句,Windows中还有
    hostname
    命令(但您调用它时不带参数)@jakub.g是的,但它不会返回完全限定的主机名。这是正确的答案,当req.headers.host给出host:port时,req.hostname和req.hostreq.host之间的不同之处已被弃用。如果使用该选项,express将输出一条警告,提示“弃用的req.host:改用req.hostname”