Meteor:如何在服务器端获取主机名

19
在客户端上,我可以使用window.location.hostname来获取主机名。如何在服务器上获取相同的结果?
我需要这个功能能够在Apache代理后使用,不幸的是Meteor.absoluteUrl()只返回localhost:3000。我还希望它能够适用于不同的域名,我想要一个Meteor应用程序为不同的域名提供不同的结果。
这个问题与在node.js Express中获取当前请求的主机名有些相关。
5个回答

33

Meteor.absoluteUrl() 返回在正确设置了ROOT_URL环境变量的前提下,Meteor应用程序外部访问地址的绝对URL。

参见以下文档:http://docs.meteor.com/#meteor_absoluteurl

Meteor不知道它所处的代理的外部地址,并且必须将此代理访问的(虚拟)域名转发到Meteor应用程序才能实现您要求的功能。 我认为目前不支持这样做。


这并没有解决他的问题,即Meteor.absoluteURL无法正常工作。如果ROOT_URL没有正确设置,请说明如何正确设置它。 - Nathaniel Ford
1
这是更好的解决方案,因为它将从ROOT_URL中给出您的域名。另一个答案中的主机名将是“短格式”主机名,例如在Mac上为Meteors-macbook,在AWS上为ip-10-100-12-123,可以由服务器设置。除非进行反向IP查找,否则服务器无法知道其自己的外部主机名,在这种情况下,某人可以轻松地将其劫持到另一个主机名。此答案是最安全且最可靠的,可以为您提供正确的主机名。 - Tarang
@NathanielFord 另外,在生产环境中,Meteor 不会启动,除非提供 ROOT_URL - Tarang
从语义上讲,这个回答在英文中无法解析为原帖的有意义的响应。它被放入“低质量”队列以进行可能的删除。我并不是要对答案的正确性发表声明,只是不清楚它如何相关,除非你已经是专家,从而降低了它对未来访问者的价值。我建议整理一下,并详细说明其正确性的原因。 - Nathaniel Ford
我没有花太多时间思考这个问题和答案。如果这个答案不好,请随意删除它。 - imslavko
+1 给 Akshat,这对我来说也是最好的解决方案。 您可以在启动应用程序时设置 ROOT_URL:ROOT_URL=https://dev.yourdomain.com meteor - rebe100x

9
根据这个,你现在可以通过访问以下内容,在Meteor.publish()Meteor.methods()调用中获取Host标头:
this.connection.httpHeaders.host

在应用程序的其他地方,很可能很难确定用于连接的Host头。


1
在nginx中,proxy_set_header Host $host;将设置host头。不同的托管提供商可能会以不同的方式设置它。 - Michael Cole

7

如果您需要获取服务器的主机名,例如在/etc/hostname中配置的:

使用meteorite

$ mrt add npm

在您的服务器代码中:

os = Npm.require('os')
hostname = os.hostname()

这与传入请求中提供的Host标头没有任何关联。

为什么?你能给一个例子,最好再给一个更好的答案吗? :) - the
2
这将为您提供服务器的主机名,例如在/etc/hostname中配置的主机名(正是我想要的!),但它与传入请求中提供的Host标头没有任何关联。不幸的是,鉴于Meteor的架构,可能很难提取Host标头。 - chmac

1
在任何服务器端的 Meteor 文件中,您都可以添加以下内容:


if (Meteor.isServer) {

  Meteor.onConnection(function(result){
    var hostname = result.httpHeaders.referer; //This returns http://foo.example.com
  });
}

0

在方法和发布中,您可以从DDP对象中获取主机作为EnvironmentVariable。Meteor accounts-base包通过this方式获取userId

const currentDomain = function() {
  const currentInvocation = DDP._CurrentMethodInvocation.get() || DDP._CurrentPublicationInvocation.get();
  return currentInvocation.connection.httpHeaders.host;
}

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