Uzyskaj nazwę hosta bieżącego żądania w node.js Express

175

Tak więc może mi brakować czegoś prostego, ale nie mogę znaleźć sposobu na uzyskanie nazwy hosta, z którego zażądano obiektu żądania, do którego wysyłam odpowiedź.

Czy można dowiedzieć się, jaką nazwę hosta aktualnie odwiedza użytkownik z node.js?

Jesse
źródło
Znajduje się w nagłówkach żądań. Cóż, tak myślałem, ale teraz tego nie widzę ... hmmmm
jcolebrand
8
CJohn go znalazł, jest w środku request.headers.host- dzięki!
Jesse,
Myślałem, że tak ... po prostu nie wyciągałem tego z głupka. Cieszę się, że to masz!
jcolebrand,
@Jesse Hej, to właściwie nie jest poprawne. request.headers.host nie jest nazwą hosta serwera opartego na systemie operacyjnym, jest to nazwa nagłówka hosta wysyłana wraz z żądaniem HTTP. Jeśli twój serwer odpowie na jakiekolwiek żądanie HTTP niezależnie od nagłówka hosta, wtedy tą wartością może być WSZYSTKO, co klient zdecyduje się wysłać.
Rob Evans
@RobEvans - Jeśli przeczytałeś ostatnią linię pytania, to właśnie tego szukałem. Klient wysyłający fałszywy nagłówek nazwy hosta to dziwny przypadek użycia, którego osobiście nie martwiłbym się, próbując go obsłużyć.
Jesse,

Odpowiedzi:

198

Jeśli mówisz o żądaniu HTTP, możesz znaleźć hosta żądania w:

request.headers.host

Ale to zależy od przychodzącej prośby.

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

Jeśli szukasz informacji o komputerze / natywnym, wypróbuj obiekt procesu.

cjohn
źródło
6
Ach, super - FWIW, nie byłoby sposobu na wykrycie rzeczywistego hosta bez żądania, można skonfigurować wiele hostów, ale właśnie tego szukałem!
Jesse,
2
Zrobiłem sztuczkę, dzięki! W Express 4 musiałem zrobić tę aktualizację: req.headers.host
Gene Bo
5
Źle! request.headers.hostzwraca, http://127.0.0.1ale nie zwraca nazwy domeny serwera produkcyjnego
Green
10
req.headers.hostsą dostarczane przez użytkownika. Mogę utworzyć żądanie w 1 linii Pythona i wysłać żądanie bez tego pola, powodując awarię kodu
arboreal84
1
request.headers.host jest teraz przestarzały, zamiast tego możesz użyć request.headers.hostname
Syam Danda
281

Możesz użyć modułu os:

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

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

Ostrzeżenia:

  1. jeśli możesz pracować z adresem IP - Maszyny mogą mieć kilka kart sieciowych i jeśli nie określisz, węzeł będzie nasłuchiwał na wszystkich z nich, więc nie wiesz, na której karcie sieciowej przyszło żądanie, zanim nadejdzie.

  2. Nazwa hosta to kwestia DNS - nie zapominaj, że kilka aliasów DNS może wskazywać ten sam komputer.

Stephenbez
źródło
6
Chociaż to zadziała, aby uzyskać nazwę hosta maszyny, mogę ustawić maszynę tak, aby odpowiadała 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 zawsze działają w kontekście aplikacji HTTP
Radagast the Brown
8
I co ważne, ten odpowiada na pytanie tak, jak zostało napisane. Myślę, że pytanie jest rzeczywiście błędne, jeśli nie jest to odpowiedź.
Rob Evans
3
Jest to skorelowane z hostnamepoleceniem, które powinno być prawidłową nazwą DNS, ale nie jest wymagane. Na przykład w systemie OS X otrzymasz nazwy, my-machine.localktórych nie można rozwiązać za pomocą DNS. Aby znaleźć zewnętrzny adres IP maszyny, musisz skorzystać z usługi, która wykonuje tę funkcję lub użyć protokołu STUN, aby to ustalić.
tadman,
6
To jest zawsze dokładne. Zwraca nazwę hosta komputera, czyli tytuł zadanego pytania. (Tekst tego zadawał inne pytanie). Nazwa hosta używana w przychodzącym żądaniu HTTP to inna sprawa.
Cheeso
18

Oto alternatywa

req.hostname

Przeczytaj o tym w Express Docs .

Eddie
źródło
1
To jest poprawna odpowiedź, ponieważ req.headers.host podaje host: port
ekerner
jaka jest różnica między req.hostname a req.host
RayLoveless
1
req.host jest przestarzały. Jeśli tego użyjesz, express wyświetli ostrzeżenie o treści `` przestarzałe req.host: zamiast tego użyj req.hostname ''
bruceczk
8

Jeśli potrzebujesz w pełni kwalifikowanej nazwy domeny i nie masz żądania HTTP, w systemie Linux możesz użyć:

var child_process = require("child_process");

child_process.exec("hostname -f", function(err, stdout, stderr) {
  var hostname = stdout.trim();
});
dricket
źródło
1
BTW jest też hostnamepolecenie w Windows (ale wywołujesz je bez parametrów)
jakub.g
7

Przede wszystkim, zanim udzielę odpowiedzi, chciałbym z góry powiedzieć, że ufając nagłówkom otwierasz drzwi do luk w zabezpieczeniach, takich jak phishing. Dlatego do celów przekierowania nie używaj wartości z nagłówków bez uprzedniego sprawdzenia, czy adres URL jest autoryzowany.

W takim przypadku nazwa hosta systemu operacyjnego może niekoniecznie odpowiadać nazwie DNS. W rzeczywistości jeden adres IP może mieć więcej niż jedną nazwę DNS. Dlatego dla celów HTTP nie ma gwarancji, że nazwa hosta przypisana do twojego komputera w konfiguracji twojego systemu operacyjnego będzie użyteczna.

Najlepszym wyborem, jaki przychodzi mi do głowy, jest uzyskanie publicznego adresu IP odbiornika HTTP i rozwiązanie jego nazwy przez DNS. Zobacz dns.reversemetodę, aby uzyskać więcej informacji. Ale znowu zwróć uwagę, że adres IP może mieć wiele nazw powiązanych z nim.

arboreal84
źródło