【问题标题】:Meteor: How to get the hostname, server sideMeteor:如何获取主机名,服务器端
【发布时间】:2014-08-09 00:23:31
【问题描述】:

在客户端我可以使用window.location.hostname 来获取主机名。我怎样才能在服务器上得到相同的东西? 我需要它在 Apache 代理后面工作,不幸的是Meteor.absoluteUrl() 给了我localhost:3000。我还希望它适用于不同的域,我想要一个 Meteor 应用程序,它可以为不同的域提供不同的结果。

这个问题有点相关:Get hostname of current request in node.js Express

【问题讨论】:

    标签: node.js meteor


    【解决方案1】:

    您可以在方法和发布中从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;
    }
    

    【讨论】:

      【解决方案2】:

      您可以在任何服务器端的流星文件中添加:

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

      【讨论】:

        【解决方案3】:

        如果你想要服务器的主机名,如/etc/hostname中配置的那样:

        meteorite:

        $ mrt add npm

        在您的服务器代码中:

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

        这与传入请求中提供的 Host 标头没有连接。

        用下面评论中的一些 chmac 的话更新了答案

        【讨论】:

        • 为什么?你能举个例子,最好是一个更好的答案吗? :)
        • 这会为您提供服务器的主机名,例如在/etc/hostname 中配置(正是我想要的!),但它与传入请求中提供的主机标头没有连接。不幸的是,鉴于 Meteor 的架构,Host 标头可能难以提取。
        【解决方案4】:

        根据this,您现在可以通过访问在Meteor.publish()Meteor.methods() 调用中获取Host 标头:

        this.connection.httpHeaders.host
        

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

        【讨论】:

        • nginx 中的 proxy_set_header Host $host; 将设置 host 标头。不同的托管服务提供商可能会设置不同。
        【解决方案5】:

        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 查找,在这种情况下,有人可以轻松地将其劫持到另一个主机名。这个答案是最安全、最有保证的,可以为您提供正确的主机名。
        • @NathanielFord 此外在生产环境中,除非提供ROOT_URL,否则流星将不会启动。
        • 从语义上讲,这个答案不会用英语解析为对原始帖子的有意义的回应。它被放入“低质量”队列以备删除。我没有就答案的正确性发表声明,只是不清楚它是如何相关的,除非你已经是专家,从而降低了它对未来访问者的价值。我建议清理它并详细说明为什么它是正确的。
        • 我没有花太多时间思考这个问题和答案。如果这个答案不好,请随时删除它。
        猜你喜欢
        • 2016-03-24
        • 2014-07-28
        • 1970-01-01
        • 1970-01-01
        • 2016-10-30
        • 2011-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多