2011-09-21 66 views
135

所以,我可能會在這裏丟失一些簡單的東西,但我似乎無法找到一種方法來獲取我發送響應的請求對象的主機名被請求從。在node.js中獲取當前請求的主機名Express

是否有可能找出用戶當前正在從node.js訪問的主機名?

+0

它在請求頭部。嗯,我認爲是這樣,但現在我沒有看到它...嗯 – jcolebrand

+8

CJohn發現它,它在'request.headers.host' - 謝謝! – Jesse

+0

這麼認爲...只是沒有把它拉出來。很高興你得到它! – jcolebrand

回答

138

如果你在談論一個HTTP請求,你可以找到在請求主持人:

request.headers.host 

但是,這依賴於傳入的請求。

更多的http://nodejs.org/docs/v0.4.12/api/http.html#http.ServerRequest

如果你正在尋找機/本地信息,嘗試的過程對象。

+5

啊,太棒了 - FWIW,沒有辦法可以檢測到沒有請求的實際主機,你可以配置多個主機,但這就是我一直在尋找的東西! – Jesse

+2

竅門,謝謝!在Express 4中,我必須執行此更新:** req.headers.host ** – gnB

+2

錯誤! 'request.headers.host'返回'http:// 127.0.0.1',但不包含生產服務器域名 – Green

260

您可以使用OS模塊:

var os = require("os"); 
os.hostname(); 

http://nodejs.org/docs/latest/api/os.html#os_os_hostname

注意事項:

  1. ,如果你能與IP地址的工作 - 機器可能有多個網卡除非你指定節點將監聽所有節點,所以你不知道在請求進入之前哪個NIC進入了。

  2. 主機名是一個DNS問題 - 不要忘記,幾個DNS別名可以指向同一臺機器。

+6

儘管這樣做可以使計算機主機名,我可以設置一臺機器來回答多個主機,所以這不太準確。 – Jesse

+7

然而,這一個更好 - 因爲你可以在模塊中使用它,它不會總是在HTTP應用程序的上下文中運行 –

+8

重要的是,這個問題在寫入時會回答問題。如果這不是答案,我認爲這個問題實際上是錯誤的。 –

7

如果你需要一個完全合格的域名,並沒有HTTP請求,在Linux上,你可以使用:

var child_process = require("child_process"); 

child_process.exec("hostname -f", function(err, stdout, stderr) { 
    var hostname = stdout.trim(); 
}); 
+0

順便說一句,在Windows中還有'hostname'命令(但是不帶參數調用它) –

4

首先,提供一個答案之前,我想請事先通知事實上,通過信任標題,您可以打開網絡釣魚等安全漏洞。因此,爲了重定向的目的,不要首先驗證URL是否經過授權才能使用頭中的值。

然後,您的操作系統主機名可能不一定匹配DNS。實際上,一個IP可能有多個DNS名稱。因此,對於HTTP目的,不能保證在操作系統配置中分配給您計算機的主機名是可用的。

我能想到的最佳選擇是獲取您的HTTP偵聽器公共IP並通過DNS解析其名稱。有關更多信息,請參閱dns.reverse方法。但是,再次請注意,一個IP可能有多個與之關聯的名稱。