Отримати ім'я хоста поточного запиту в node.js Express


175

Отже, я можу пропустити щось просте тут, але я не можу знайти спосіб отримати ім'я хоста, від якого запитувався об’єкт запиту, на який я надсилав відповідь.

Чи можливо з’ясувати, яке ім'я хоста зараз відвідує користувач із node.js?


Це в заголовках запиту. Ну я так подумав, але зараз цього не бачу ...
хммм

8
CJohn знайшов це, це request.headers.host- спасибі!
Джессі

Думав так ... просто не витягнув його з оле ноги. Радий, що ти це отримав!
jcolebrand

@Jesse Гей, це насправді не правильно. request.headers.host - це не ім'я сервера на базі ОС, це ім'я заголовка хоста, надіслане разом із запитом HTTP. Якщо ваш сервер відповідає на будь-який запит HTTP незалежно від заголовка хоста, то це значення може бути будь-яким, що клієнт вирішив надіслати.
Роб Еванс

@RobEvans - Якщо ви прочитали останній рядок питання, саме це я шукав. Клієнт, який надсилає підроблений заголовок імені хоста, - це химерний випадок використання, який я особисто не хвилююся, намагаючись підтримати.
Джессі

Відповіді:


198

Якщо ви говорите про HTTP-запит, ви можете знайти хост запиту в:

request.headers.host

Але це покладається на вхідний запит.

Детальніше на http://nodejs.org/docs/v0.4.12/api/http.html#http.ServerRequest

Якщо ви шукаєте машинну / рідну інформацію, спробуйте об'єкт процесу.


6
Ах, дивовижно - FWIW, не було б можливості виявити фактичного хоста без запиту, ви могли б налаштувати кілька хостів, але це те, що я шукав!
Джессі

2
Трюк зробив, спасибі! У Express 4 мені довелося зробити це оновлення: req.headers.host
Джин Бо

5
Неправильно! request.headers.hostповертає, http://127.0.0.1але не доменне ім'я сервера виробництва
Зелений

10
req.headers.hostнадається користувачем. Я можу скласти запит в 1 рядку python і надіслати вам запит без того поля, щоб зробити ваш збій коду
arboreal84

1
request.headers.host тепер застарілий, замість цього ви можете використовувати request.headers.hostname
Syam Danda

281

Ви можете використовувати модуль 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
Хоча це допоможе отримати ім'я хоста машини, я можу створити машину для відповіді на кілька хостів, тому це не буде точно.
Джессі

7
Однак це краще - адже ви можете використовувати його в модулях, які не завжди працюють у контексті програми HTTP
Radagast The Brown

8
І що важливо, цей відповідає на питання так, як було написано. Я думаю, що питання насправді неправильне, якщо це не відповідь.
Роб Еванс

3
Це співвідноситься з hostnameкомандою, яка повинна бути дійсним іменем DNS, але не обов'язковою. Наприклад, в OS X ви отримаєте такі імена, my-machine.localякі не можна вирішити за допомогою DNS. Щоб розібратися у зовнішньому IP-адресі машини, вам потрібно буде звернутися до служби, яка виконує цю функцію, або скористатися протоколом STUN, щоб визначити це.
тадман

6
Це завжди точно. Він повертає ім'я хоста машини, саме про це і задається назва запитання. (Текст цього задав інше запитання). Ім'я хоста, яке використовується для вхідного HTTP-запиту, є іншим питанням.
Чесо

18

Ось заступник

req.hostname

Про це читайте в Express Docs .


1
Це правильна відповідь, оскільки req.headers.host дає хост: port
ekerner

чим відрізняється req.hostname від req.host
RayLoveless

1
req.host застарілий. Якщо ви користуєтесь цим, Express виведе попередження із записом "застарілий req.host: замість цього використовуйте req.hostname"
bruceczk

8

Якщо вам потрібно повноцінне доменне ім’я та не маєте HTTP-запиту, в Linux ви можете використовувати:

var child_process = require("child_process");

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

1
BTW також є hostnameкоманда в Windows (але ви викликаєте її без параметрів)
jakub.g

7

Перш за все, перш ніж надати відповідь, я хотів би заздалегідь ознайомитись з тим, що, довіряючи заголовкам, ви відкриваєте двері до вразливості безпеки, таких як фішинг. Тому для цілей перенаправлення не використовуйте значення заголовків без попередньої перевірки URL-адреси.

Тоді ім'я хоста вашої операційної системи може не обов’язково відповідати DNS. Насправді один IP може мати більше одного імені DNS. Отже, для цілей HTTP немає гарантії, що ім'я хоста, призначене вашому пристрою в конфігурації вашої операційної системи, може бути використане.

Найкращий вибір, про який я можу подумати, - це отримати загальнодоступну IP-адресу вашого слухача HTTP та визначити її ім'я через DNS. Додаткову інформацію див. У dns.reverseметоді. Але знову ж таки зауважте, що в IP може бути пов'язано кілька імен.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.