【问题标题】:node.js:: what does hostname do in `listen` function?node.js:: hostname 在“listen”函数中做了什么?
【发布时间】:2010-07-04 09:51:04
【问题描述】:

我拥有两个域,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);

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

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

那么 主机名参数有什么作用呢?

【问题讨论】:

    标签: node.js


    【解决方案1】:

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

    // 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();
      }
    });
    

    所以基本上提供一个 url 作为主机名参数不允许共享主机。 node.js 所做的就是为您完成将主机名解析为 ip 地址的工作——因为在我的情况下,两个域都指向同一个 ip,所以两者都可以工作。

    为了让我做共享主机,我必须找到另一种方式。

    【讨论】:

    • 你找到其他方法了吗?
    • @pksorensen,还有其他问题需要处理 Node.js 上的virtual hosting
    • 节点这样做真的很奇怪,因为没有将服务器绑定到实际主机名的概念。发生的事情是该节点正在将 IP 地址绑定到服务器。整个 DNS 查找掩盖了这一点,使文档变得不那么清晰(即使是六年后)。我不知道他们为什么不只是调用参数ip_address 并取消查找。虚拟主机是一个完全不同的球赛,与这里发生的事情无关。
    猜你喜欢
    • 2019-05-04
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 2017-07-27
    • 2018-04-19
    • 1970-01-01
    相关资源
    最近更新 更多