Получить имя хоста текущего запроса в node.js Express
175
Итак, я могу упустить что-то простое здесь, но я не могу найти способ получить имя хоста, на который был запрошен объект запроса, на который я отправляю ответ.
Можно ли выяснить, какое имя хоста пользователь посещает в данный момент из node.js?
Это в заголовках запросов. Ну, я так и думал, но теперь я не вижу этого ...
хмммм
8
CJohn нашел это, это в request.headers.host- спасибо!
Джесси
Мысль так ... просто не вытащила его из олегина. Рад, что вы получили это!
Jcolebrand
@ Джесси Эй, это на самом деле не правильно. request.headers.host - это не имя хоста сервера в зависимости от ОС, это имя заголовка хоста, отправляемое вместе с HTTP-запросом. Если ваш сервер отвечает на любой HTTP-запрос независимо от заголовка узла, то это значение может быть НИЧЕГО, что клиент решит отправить.
Роб Эванс
@RobEvans - Если вы прочитали последнюю строчку вопроса, это именно то, что я искал. Клиент, отправляющий поддельный заголовок имени хоста, является причудливым вариантом использования, который я лично не буду беспокоиться о поддержке.
Джесси
Ответы:
198
Если вы говорите о HTTP-запросе, вы можете найти узел запроса в:
Ах, круто - FWIW, не было бы способа обнаружить реальный хост без запроса, вы могли бы настроить несколько хостов, но это то, что я искал!
Джесси
2
Сделал трюк, спасибо! В Express 4 я должен был сделать это обновление: req.headers.host
Джин Бо,
5
Неправильно! request.headers.hostвозвращает, http://127.0.0.1но не имя домена
Green
10
req.headers.hostпредоставляется пользователем. Я могу обработать запрос в 1 строке Python и отправить вам запрос без этого поля, что приводит к сбою вашего кода
arboreal84
1
request.headers.host устарела, вместо этого вы можете использовать request.headers.hostname
если вы можете работать с IP-адресом - у компьютеров может быть несколько сетевых карт, и если вы не укажете их, узел будет прослушивать все из них, поэтому вы не знаете, на какой сетевой адаптер поступил запрос, прежде чем он поступит.
Имя хоста - это вопрос DNS. Не забывайте, что несколько псевдонимов DNS могут указывать на одну и ту же машину.
Хотя это будет работать для получения имени хоста машины, я могу настроить машину так, чтобы она отвечала на несколько хостов, так что это не будет точным.
Джесси
7
Однако этот лучше - потому что вы можете использовать его в модулях, которые не всегда работают внутри контекста HTTP-приложения
Радагаст Браун
8
И что важно, этот отвечает на вопрос так, как он был написан. Я думаю, что вопрос на самом деле не так, если это не ответ.
Роб Эванс
3
Это соотносится с hostnameкомандой, которая должна быть допустимым DNS-именем, но не обязательна. Например, в OS X вы получите такие имена, my-machine.localкоторые невозможно решить с помощью DNS. Чтобы выяснить внешний IP-адрес компьютера, вам нужно обратиться к службе, которая выполняет эту функцию, или использовать протокол STUN, чтобы выяснить это.
tadman
6
Это всегда точно. Он возвращает имя хоста машины, которое является названием вопроса. (Текст этого задал другой вопрос). Имя хоста, используемое во входящем HTTP-запросе, является другим вопросом.
Кстати, hostnameв Windows есть также команда (но вы вызываете ее без параметров)
jakub.g
7
Прежде всего, прежде чем дать ответ, я хотел бы быть в курсе того факта, что доверяя заголовкам, вы открываете дверь уязвимостям безопасности, таким как фишинг. Поэтому для целей перенаправления не используйте значения из заголовков без предварительной авторизации URL-адреса.
Тогда имя вашей операционной системы может не совпадать с именем DNS. Фактически, один IP может иметь более одного DNS-имени. Таким образом, для целей HTTP нет гарантии, что имя хоста, назначенное вашему компьютеру в конфигурации вашей операционной системы, пригодно для использования.
Лучший выбор, который я могу придумать, - это получить публичный IP-адрес прослушивателя HTTP и разрешить его имя через DNS. Смотрите dns.reverseметод для получения дополнительной информации. Но опять же, обратите внимание, что IP может иметь несколько имен, связанных с ним.
request.headers.host
- спасибо!Ответы:
Если вы говорите о HTTP-запросе, вы можете найти узел запроса в:
Но это зависит от входящего запроса.
Больше на http://nodejs.org/docs/v0.4.12/api/http.html#http.ServerRequest
Если вы ищете машинную / нативную информацию, попробуйте объект процесса.
источник
request.headers.host
возвращает,http://127.0.0.1
но не имя доменаreq.headers.host
предоставляется пользователем. Я могу обработать запрос в 1 строке Python и отправить вам запрос без этого поля, что приводит к сбою вашего кодаВы можете использовать модуль os:
См. Http://nodejs.org/docs/latest/api/os.html#os_os_hostname
Предостережения:
если вы можете работать с IP-адресом - у компьютеров может быть несколько сетевых карт, и если вы не укажете их, узел будет прослушивать все из них, поэтому вы не знаете, на какой сетевой адаптер поступил запрос, прежде чем он поступит.
Имя хоста - это вопрос DNS. Не забывайте, что несколько псевдонимов DNS могут указывать на одну и ту же машину.
источник
hostname
командой, которая должна быть допустимым DNS-именем, но не обязательна. Например, в OS X вы получите такие имена,my-machine.local
которые невозможно решить с помощью DNS. Чтобы выяснить внешний IP-адрес компьютера, вам нужно обратиться к службе, которая выполняет эту функцию, или использовать протокол STUN, чтобы выяснить это.Вот альтернативный
Читайте об этом в Express Docs .
источник
Если вам нужно полное доменное имя и нет HTTP-запроса, в Linux вы можете использовать:
источник
hostname
в Windows есть также команда (но вы вызываете ее без параметров)Прежде всего, прежде чем дать ответ, я хотел бы быть в курсе того факта, что доверяя заголовкам, вы открываете дверь уязвимостям безопасности, таким как фишинг. Поэтому для целей перенаправления не используйте значения из заголовков без предварительной авторизации URL-адреса.
Тогда имя вашей операционной системы может не совпадать с именем DNS. Фактически, один IP может иметь более одного DNS-имени. Таким образом, для целей HTTP нет гарантии, что имя хоста, назначенное вашему компьютеру в конфигурации вашей операционной системы, пригодно для использования.
Лучший выбор, который я могу придумать, - это получить публичный IP-адрес прослушивателя HTTP и разрешить его имя через DNS. Смотрите
dns.reverse
метод для получения дополнительной информации. Но опять же, обратите внимание, что IP может иметь несколько имен, связанных с ним.источник