【问题标题】:Get hostname of current request in node.js Express在 node.js Express 中获取当前请求的主机名
【发布时间】:2011-11-22 08:23:04
【问题描述】:

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

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

【问题讨论】:

  • 它在请求标头中。嗯,我是这么认为的,但现在我看不到它......嗯
  • CJohn 找到了,在 request.headers.host - 谢谢!
  • 这么想……只是没有把它从头上拉出来。很高兴你得到它!
  • @Jesse 嘿,这实际上是不正确的。 request.headers.host 不是基于操作系统的服务器的主机名,它是与 HTTP 请求一起发送的主机头名称。如果您的服务器响应任何 HTTP 请求而不考虑主机标头,那么该值可能是客户端决定发送的任何值。
  • @RobEvans - 如果您阅读了问题的最后一行,那正是我想要的。发送虚假主机名标头的客户端是一个奇怪的用例,我个人不会担心尝试支持。

标签: node.js express hostname


【解决方案1】:

你可以使用 os 模块:

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

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

注意事项:

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

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

【讨论】:

  • 虽然这可以获取机器的主机名,但我可以将机器设置为响应多个主机,所以这不准确。
  • 但是这个更好——因为你可以在不总是在 HTTP 应用程序上下文中运行的模块中使用它
  • 重要的是这个回答了问题,因为它是写的。如果这不是答案,我认为这个问题实际上是错误的。
  • 这与hostname 命令相关,该命令应该是一个有效的 DNS 名称,但不是必须的。例如,在 OS X 下,您会得到像 my-machine.local 这样的名称,这是 DNS 无法解析的。要确定机器的外部 IP,您需要点击 service that performs this function 或使用 STUN protocol 来确定。
  • 这是总是准确的。它返回机器的主机名,这就是问题的标题。 (这篇文章提出了一个不同的问题)。传入 HTTP 请求中使用的主机名是另一回事。
【解决方案2】:

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

request.headers.host

但这依赖于传入的请求。

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

如果您正在寻找机器/本机信息,请尝试使用进程对象。

【讨论】:

  • 啊,太棒了 - FWIW,没有请求就无法检测到实际主机,您可以配置多个主机,但这就是我要找的!
  • 成功了,谢谢!在 Express 4 中,我必须进行此更新:req.headers.host
  • 错了! request.headers.host 返回 http://127.0.0.1 但不是生产服务器域名
  • req.headers.host 由用户提供。我可以在 1 行 python 中制作一个请求,然后在没有该字段的情况下向您发送一个请求,从而使您的代码崩溃
  • request.headers.host 现在已弃用,您可以使用 request.headers.hostname
【解决方案3】:

这是一个替代品

req.hostname

Express Docs 中了解它。

【讨论】:

  • 这是正确答案,因为 req.headers.host 给出了 host:port
  • req.hostname 和 req.host 有什么区别
  • req.host 已弃用。如果你使用它,express 会输出一个警告说'deprecated req.host: Use req.hostname instead'
【解决方案4】:

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

var child_process = require("child_process");

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

【讨论】:

  • 顺便说一句,Windows 中也有 hostname 命令(但你在没有参数的情况下调用它)
  • @jakub.g 是的,但是,它不返回完全限定的主机名。
【解决方案5】:

首先,在提供答案之前,我想先声明这样一个事实,即通过信任标头,您正在为网络钓鱼等安全漏洞打开大门。因此,出于重定向目的,请勿在未先验证 URL 已授权的情况下使用标头中的值。

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

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

【讨论】:

    【解决方案6】:

    要么通过并从前端标头获取它,要么简单地将其放在.env 中,其中 .gitignore 忽略 .env 文件,因此对于每个服务器环境,您将拥有不同的 .env,其中包含该服务器的主机字符串

    .env 代码

    HOSTNAME=example.com
    

    你想要hotname的文件。

    const dotenv = require("dotenv");
    dotenv.config();
    
    console.log('hostname: '+process.env.HOSTNAME)
    

    输出:

    hostname: example.com
    

    【讨论】:

      猜你喜欢
      • 2018-01-26
      • 2013-11-20
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 2019-11-13
      • 2021-10-18
      相关资源
      最近更新 更多