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?
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:
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.
Nazwa hosta to kwestia DNS - nie zapominaj, że kilka aliasów DNS może wskazywać ten sam komputer.
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.
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.
request.headers.host
- dzięki!Odpowiedzi:
Jeśli mówisz o żądaniu HTTP, możesz znaleźć hosta żądania w:
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.
źródło
request.headers.host
zwraca,http://127.0.0.1
ale nie zwraca nazwy domeny serwera produkcyjnegoreq.headers.host
są dostarczane przez użytkownika. Mogę utworzyć żądanie w 1 linii Pythona i wysłać żądanie bez tego pola, powodując awarię koduMożesz użyć modułu os:
Zobacz http://nodejs.org/docs/latest/api/os.html#os_os_hostname
Ostrzeżenia:
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.
Nazwa hosta to kwestia DNS - nie zapominaj, że kilka aliasów DNS może wskazywać ten sam komputer.
źródło
hostname
poleceniem, które powinno być prawidłową nazwą DNS, ale nie jest wymagane. Na przykład w systemie OS X otrzymasz nazwy,my-machine.local
któ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ć.Oto alternatywa
Przeczytaj o tym w Express Docs .
źródło
Jeśli potrzebujesz w pełni kwalifikowanej nazwy domeny i nie masz żądania HTTP, w systemie Linux możesz użyć:
źródło
hostname
polecenie w Windows (ale wywołujesz je bez parametrów)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.reverse
metodę, aby uzyskać więcej informacji. Ale znowu zwróć uwagę, że adres IP może mieć wiele nazw powiązanych z nim.źródło