在Node.js中获取客户端主机名

8

在Node.js中是否可以获取主机名

以下是我获取客户端IP的方法:

var ip = request.header('x-forwarded-for');

那么,我该如何获取客户端的主机名?

var hostname = request.header('???');

感谢您的回复!

2
你为什么认为他们有一个呢? :) - Nick Craver
所以并不是每个人都有主机名? - Ryan Zygg
1
绝对不是,那是一个反向DNS查找,每个人可能有也可能没有。 - Nick Craver
2
事实上,即使HTTPD具备此能力,在实际安装中也会被禁用,因为它很慢。顺便说一句,X-FORWARDED-FOR是代理标头,正确的应该是REMOTE_ADDR。(在主机名查找的情况下是REMOTE_HOST) - Free Consulting
6个回答

16

14

我觉得这可能会对你有帮助。那不是客户端主机名,而是IP地址。

function getClientAddress(req) {
  return req.headers['x-forwarded-for'] || req.connection.remoteAddress;
}

4
不正确,如果连接没有被代理,它会使用远程地址。 - w00t
你应该在你的帖子中更清楚地表达,但还是点赞。 - J.J
解决了本地开发和在Heroku上使用反向代理的应用程序的问题! :) - David Gatti

6
我认为你只能像这样做:

我认为你只能像这样做:

<form method="post" action="/gethostname">
    <label for="hostname">What is your hostname?</label>
    <input type="text" name="hostname" id="hostname">
</form>

但我建议你并不真的需要它,因为你无法从这些信息中获得任何有用的东西。如果你只是想要一个字符串来识别用户的机器,那么你可以自己编造一个。

如果你真正想要的是FQDN,则我建议这对你仍然没有太大用处,但你需要进行反向DNS查找。如果你在VPS或类似的平台上,你可能可以配置你的服务器来为你执行此操作,但请注意这可能需要几秒钟的时间,因此不建议将其作为响应的一部分进行。另外请注意,在大多数情况下,你将无法获取用户机器的FQDN,而是获取他们路由器的FQDN。


0

如果你正在使用socket.io,你也可以通过以下方式实现相同的效果:

// Setup an example server
var server = require('socket.io').listen(8080);

// On established connection
server.sockets.on('connection', function (socket) {

    // Get server host
    var host = socket.handshake.headers.host;

    // Remove port number together with colon
    host = host.replace(/:.*$/,"");

    // To test it, output to console
    console.log(host);
});

-1

你可以从os模块获取主机名:

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

这将返回服务器的主机名。 - Mehmet AVŞAR

-1
如果你正在使用Express,
那么你可以按照以下方式操作,
var express = require("express"); 
var app = express.createServer();
app.listen(8080);

app.get("/", function (req, res){
    console.log("REQ:: "+req.headers.host);
    res.end(req.headers.host);
});

如前所述,如果请求已被代理,则主机标头不具有正确的数据。 - Neuquino
1
当我尝试这个时,req.headers.host 包含了服务器的主机名,直到使用的 "8080" 端口。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接