2014-06-18 98 views
16

在客戶端上,我可以使用window.location.hostname獲取主機名。我如何在服務器上獲得相同的結果? 我需要這個工作在Apache代理的後面,不幸的是Meteor.absoluteUrl()給了我localhost:3000。我也希望它適用於不同的領域,我想要一個Meteor應用程序,爲不同的領域提供不同的結果。流星:如何獲取主機名,服務器端

這個問題是有點關係:Get hostname of current request in node.js Express

回答

29

Meteor.absoluteUrl()給您ROOT_URL環境變量設置正確。

請參閱以下文檔:http://docs.meteor.com/#meteor_absoluteurl

流星並不知道它所在的代理服務器的外部地址,並且該代理服務器被訪問的(虛擬)域必須被轉發到Meteor應用程序才能執行你所要做的事情要求。我不認爲這是目前支持。

+0

這並沒有解決他的問題,「Meteor.absoluteURL」不起作用。如果'ROOT_URL'設置不正確,請解釋如何正確設置它。 –

+1

這是一個更好的解決方案,因爲它會從'ROOT_URL'給你你的域名。來自其他答案的主機名將是'short form'主機名,例如在Mac Meteors-macbook或AWS上,例如可以由服務器設置的'ip-10-100-12-123'。服務器無法知道自己的外部主機名,除非它進行反向IP查找,在這種情況下,有人可以輕鬆將其劫持到另一個主機名。這個答案是最安全和最有保證的,可以給你正確的主機名。 – Akshat

+0

@NathanielFord此外,在生產環境中,除非提供「ROOT_URL」,否則流星將不會啓動。 – Akshat

6

如果你想在服務器的主機名中的配置,/etc/hostname例如:

隨着meteorite

$ mrt add npm

在您的服務器代碼:

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

這沒有連接到傳入請求中提供的主機頭。

一些從註釋chmac的話更新回答以下

+0

這是正確的答案:) –

+0

我懷疑它返回相同的主機名在瀏覽器... –

+0

爲什麼呢?你能舉一個例子,理想情況下更好的答案? :) – guaka

9

根據this您可以通過訪問現在進去Meteor.publish()Meteor.methods()呼叫Host頭:

this.connection.httpHeaders.host 

在亞洲其他應用程序,它可能難以確定正被用來連接Host頭。

+1

'proxy_set_header Host $ host;'在nginx中設置'host'標題。差異託管服務提供商可能以不同的方式進 –

1

在任何服務器端流星文件,您可以添加:

if (Meteor.isServer) { 

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