node.js :: hostname在`listen`函数中做了什么?

Ale*_*ird 9 node.js

我拥有两个域名,abc.com和xyz.com(不是我拥有的真实域名,但它们就是一个例子).它们都指向相同的IP地址.以下是我的服务器js文件:

var sys=require('sys'),
  http=require('http'),
  settings=require('./settings');



var srv = http.createServer(function(req, res) {
    var body="<b>Hello World!</b>"
    res.writeHead(200, {
        'content-length': body.length,
          'content-type': 'text/html',
          'stream': 'keep-alive',
          'accept': '*/*'
          }
      );
    res.end(body);
  });

srv.listen(8000, 'abc.com' ); // (settings.port, settings.hostname);
Run Code Online (Sandbox Code Playgroud)

然后我访问http://abc.com:8000/和http://xyz.com:8000/ ,他们都显示网页.我以为我只能在abc.com上看到这个页面,因为那是我设置的主机名.

但是,当我将'127.0.0.1'作为主机名时,我只能通过服务器本身的wget查看页面.

那么,什么也 hostname参数呢?

Ale*_*ird 6

net.js中定义listen函数的以下代码段是相关的:

// the first argument is the port, the second an IP    
var port = arguments[0];
dns.lookup(arguments[1], function (err, ip, addressType) {
  if (err) {
    self.emit('error', err);
  } else {
    self.type = addressType == 4 ? 'tcp4' : 'tcp6';
    self.fd = socket(self.type);
    bind(self.fd, port, ip);
    self._doListen();
  }
});
Run Code Online (Sandbox Code Playgroud)

所以基本上提供一个url作为hostname参数不允许共享主机.所有node.js都可以帮你解决主机名到ip地址的问题 - 因为在我的情况下,两个域都指向同一个ip,两者都可以工作.

对我来说,做共享主机,我必须找到另一种方式.

  • 你找到了另一种方式吗? (10认同)
  • 节点这样做真的很奇怪,因为没有将服务器绑定到*实际*主机名的概念。发生的事情是节点正在将 IP 地址绑定到服务器。整个 DNS 查找掩盖了这一点,并使文档不太清楚(即使是六年后)。我不知道为什么他们不只是调用参数“ip_address”并取消查找。虚拟主机是一个完全不同的球赛,与这里发生的事情无关。 (2认同)