【发布时间】:2014-08-09 00:23:31
【问题描述】:
在客户端我可以使用window.location.hostname 来获取主机名。我怎样才能在服务器上得到相同的东西?
我需要它在 Apache 代理后面工作,不幸的是Meteor.absoluteUrl() 给了我localhost:3000。我还希望它适用于不同的域,我想要一个 Meteor 应用程序,它可以为不同的域提供不同的结果。
【问题讨论】:
在客户端我可以使用window.location.hostname 来获取主机名。我怎样才能在服务器上得到相同的东西?
我需要它在 Apache 代理后面工作,不幸的是Meteor.absoluteUrl() 给了我localhost:3000。我还希望它适用于不同的域,我想要一个 Meteor 应用程序,它可以为不同的域提供不同的结果。
【问题讨论】:
您可以在方法和发布中从DDP 对象中获取主机为EnvironmentVariable。 Meteor accounts-base package fetch userId via this 方式。
const currentDomain = function() {
const currentInvocation = DDP._CurrentMethodInvocation.get() || DDP._CurrentPublicationInvocation.get();
return currentInvocation.connection.httpHeaders.host;
}
【讨论】:
您可以在任何服务器端的流星文件中添加:
if (Meteor.isServer) {
Meteor.onConnection(function(result){
var hostname = result.httpHeaders.referer; //This returns http://foo.example.com
});
}
【讨论】:
如果你想要服务器的主机名,如/etc/hostname中配置的那样:
$ mrt add npm
在您的服务器代码中:
os = Npm.require('os')
hostname = os.hostname()
这与传入请求中提供的 Host 标头没有连接。
用下面评论中的一些 chmac 的话更新了答案
【讨论】:
/etc/hostname 中配置(正是我想要的!),但它与传入请求中提供的主机标头没有连接。不幸的是,鉴于 Meteor 的架构,Host 标头可能难以提取。
根据this,您现在可以通过访问在Meteor.publish() 和Meteor.methods() 调用中获取Host 标头:
this.connection.httpHeaders.host
在应用程序的其他地方,可能很难确定用于连接的 Host 标头。
【讨论】:
proxy_set_header Host $host; 将设置 host 标头。不同的托管服务提供商可能会设置不同。
Meteor.absoluteUrl() 假设您的 ROOT_URL 环境变量设置正确。
请参阅以下文档:http://docs.meteor.com/#meteor_absoluteurl。
Meteor 不知道它所在的代理的外部地址,并且必须将访问此代理的(虚拟)域转发到 Meteor 应用程序才能执行您的要求为了。我认为目前不支持此功能。
【讨论】:
Meteor.absoluteURL 不起作用的问题。如果ROOT_URL设置不正确,请说明如何正确设置。
ROOT_URL 的域名称。来自另一个答案的主机名将是“短格式”主机名,例如在 mac 上 Meteors-macbook 或在 AWS 上类似 ip-10-100-12-123 的东西可以由服务器设置。服务器无法知道自己的外部主机名,除非它进行反向 ip 查找,在这种情况下,有人可以轻松地将其劫持到另一个主机名。这个答案是最安全、最有保证的,可以为您提供正确的主机名。
ROOT_URL,否则流星将不会启动。