2011-09-21 11 views
135

Może brakuje mi tutaj czegoś prostego, ale nie mogę znaleźć sposobu na uzyskanie nazwy hosta, o którą prosi się obiekt żądania, na który wysyłam odpowiedź od.Uzyskaj nazwę hosta bieżącego żądania w pliku node.js Express

Czy można dowiedzieć się, jaka nazwa hosta aktualnie odwiedza użytkownik z pliku node.js?

+0

Znajduje się w nagłówku żądania. Cóż, tak myślałem, ale teraz tego nie widzę ... hmmmm – jcolebrand

+8

CJohn to znalazł, jest w 'request.headers.host' - dziękuję! – Jesse

+0

Myślałem, że ... po prostu nie wyciągnąłem go z ole noggin. Cieszę się, że to masz! – jcolebrand

Odpowiedz

138

Jeśli mówimy o żądaniu HTTP, można znaleźć hosta życzenie w:

request.headers.host 

Ale to opiera się na przychodzące żądanie.

Więcej na http://nodejs.org/docs/v0.4.12/api/http.html#http.ServerRequest

Jeśli szukasz maszyny/rodzimej informacji, spróbuj przedmiot procesu.

+5

Ah, awesome - FWIW, nie byłoby sposobu, aby wykryć rzeczywisty host bez żądania, można skonfigurować wiele hostów, ale tego właśnie szukałem! – Jesse

+2

Podstęp, dzięki! W Express 4 musiałem wykonać tę aktualizację: ** req.headers.host ** – gnB

+2

Wrong! 'request.headers.host' zwraca' http: // 127.0.0.1', ale nie nazywa domeny serwera produkcyjnego – Green

260

można użyć modułu SO:

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

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

Ostrzeżenia:

  1. jeśli można pracować z adresem IP - Maszyna może mieć kilka kart sieciowych i jeśli nie określisz tego węzeł będzie nasłuchiwał na wszystkich z nich, więc nie wiesz, do której karty NIC żądanie wpłynęło, zanim ono wejdzie.

  2. Nazwa hosta to sprawa DNS - Nie zapominaj, że kilka aliasów DNS może wskazywać na to samo urządzenie.

+6

Chociaż będzie to działać, aby uzyskać nazwa hosta, mogę ustawić komputer tak, aby odpowiadał na wiele hostów, więc nie byłoby to dokładne. – Jesse

+7

Jednak ten jest lepszy - ponieważ można go używać w modułach, które nie działają zawsze w kontekście aplikacji HTTP –

+8

Co ważne, ten odpowiada na pytanie, tak jak zostało napisane. Myślę, że to pytanie jest w rzeczywistości błędne, jeśli nie jest to odpowiedź. –

7

Jeśli chcesz w pełni kwalifikowaną nazwę domeny i nie mają żądania HTTP, na Linux, można użyć:

var child_process = require("child_process"); 

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

BTW istnieje również komenda 'hostname' w systemie Windows (ale wywołuje się ją bez parametrów) –

4

Przede wszystkim, zanim udzielenia odpowiedzi chciałabym być z góry o fakt, że ufając nagłówkom otwierasz drzwi do luk w zabezpieczeniach, takich jak phishing. Tak więc dla celów przekierowania nie używaj wartości z nagłówków bez uprzedniej weryfikacji adresu URL.

Następnie nazwa hosta systemu operacyjnego niekoniecznie musi odpowiadać nazwie DNS. W rzeczywistości jeden adres IP może mieć więcej niż jedną nazwę DNS. Tak więc dla celów HTTP nie ma gwarancji, że nazwa hosta przypisana do komputera w konfiguracji systemu operacyjnego jest użyteczna.

Najlepszy wybór, jaki mogę wymyślić, to uzyskać publiczny adres IP odbiornika HTTP i rozwiązać jego nazwę przez DNS. Zobacz metodę dns.reverse, aby uzyskać więcej informacji. Ale potem ponownie zauważ, że adres IP może mieć wiele nazw skojarzonych z nim.

Powiązane problemy