Що таке заголовок хоста http?


120

Зважаючи на те, що підключення TCP вже встановлено, коли HTTP-запит надсилається, IP-адреса та порт неявно відомі - TCP-з'єднання - порт IP +. Отже, навіщо нам потрібен Hostзаголовок? Чи потрібно це лише у випадку, коли в ході TCP-з'єднання є кілька хостів, відображених на IP-адресу?

Відповіді:


141

hostТема повідомляє веб - сервер , який віртуальний хост для використання (якщо він налаштований). Ви навіть можете мати один і той же віртуальний хост, використовуючи кілька псевдонімів (= домени та доменні символи). У цьому випадку ви все ще маєте можливість читати цей заголовок вручну у веб-додатку, якщо ви хочете надати різну поведінку на основі різних доменів. Це можливо тому, що на своєму веб-сервері ви можете (і якщо я не помиляюся, ви повинні) встановити один vhost, щоб бути хостом за замовчуванням. Цей vhost за замовчуванням використовується, коли hostзаголовок не відповідає жодному з налаштованих віртуальних хостів.

Це означає: Ви правильно розумієте, хоча вимова "декількох хостів" може бути дещо оманливою: Хост (адресована машина) той самий, що дійсно вирішується на IP-адресу - це різні доменні імена (включаючи субдомени), які також передаються як імена хостів (але не хости!).

Хоча це не є питанням, цікавий факт: ця специфікація призвела до проблем із SSL в перші дні, оскільки веб-сервер повинен доставити сертифікат, який відповідає домену, до якого звернувся клієнт. Однак, щоб знати, яким сертифікатом користуватися, веб-сервер повинен був знати заздалегідь вказане ім’я хоста. Але оскільки клієнт надсилає цю інформацію лише за зашифрованим каналом (це означає: після того, як сертифікат вже надісланий), сервер повинен був припустити, що ви переглядаєте хост за замовчуванням. Це означало один захищений ssl домен на IP-адресу / комбінацію портів.

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

Хоча веб-сервер знає ім'я хоста з Індикації імені сервера, hostзаголовок не є застарілим, оскільки інформація про вказівки імені сервера використовується лише в рукостисканні TLS. При незахищеному з’єднанні взагалі немає вказівки імені сервера, тому hostзаголовок все ще дійсний (і необхідний).

Ще один цікавий факт: Більшість веб-серверів (якщо не всі) відхиляють ваш http-запит, якщо він не містить точно одного hostзаголовка, навіть якщо його можна опустити, оскільки налаштований лише vhost за замовчуванням. Це означає, що мінімально необхідна інформація у запиті http- (get-) є першим рядком, що містить METHOD RESOURCEі, PROTOCOL VERSIONщонайменше, hostзаголовка, як це:

GET /someresource.html HTTP/1.1
Host: www.example.com

У Документації MDN про заголовок хоста вони насправді формулюють це так:

Поле заголовка хоста повинно бути надіслане у всіх повідомленнях HTTP / 1.1. Код стану 400 (поганий запит) буде надісланий на будь-яке повідомлення запиту HTTP / 1.1, у якому відсутнє поле заголовка хоста або містить більше одного.

Як згадував Даррел Міллер, повні характеристики можна знайти в RFC7230 .


хороша відповідь. Ви написали "Це можливо, тому що на своєму веб-сервері ви можете (і якщо я не помиляюся, ви повинні) встановити один vhost, щоб бути хостом за замовчуванням. Цей vhost за замовчуванням використовується, коли заголовок хоста не відповідає жодному з налаштованих віртуальних господарі ". Я хотів перевірити в RFC7230, але не знайшов vhostлише 3 закритих virtual hostзначення зі значенням, не близьким до вашої фрази, і 12 defaultздебільшого про порт,
Олексій Мартьянов

про хост лише те: "Якщо ні, то якщо поле заголовка Host постачається з не порожнім полем-значенням, компонент повноважень такий же, як значення поля Host". - не ІМХО те саме. Чи можете ви вказати мені, щоб я вказав на RFC про це?
Олексій Мартьянов

практична сторона: на якийсь сервер я надсилаю POST із заголовком хост = доменне ім’я та отримую 200 (добре), я надсилаю змінений заголовок хоста і отримую 404 (не знайдено). Чи може це означати, що сервер не (повністю by the book) налаштований?
Олексій Мартьянов

оскільки коментар не може бути відредагований: цитата у другому була поруч із defaultсловом, знайденим пошуком,Otherwise, the authority component is assigned the default name configured for the server
Олексій Мартьянов

дивно. усі 3 випадки, virtual hostзнайдені моїм пошуком в tools.ietf.org/html/rfc7230, є в Appendix A. HTTP Version History. схоже, що ваш пошук знайшов якийсь інший.
Олексій Мартьянов

30

Я завжди рекомендую звернутися до авторитетного джерела, намагаючись зрозуміти значення та призначення заголовків HTTP.

Поле заголовка "Хост" у запиті надає інформацію про хост і порт
від цільового URI, що дозволяє серверу
початківців розрізняти ресурси під час обслуговування запитів для кількох
імен хостів на одній IP-адресі.

https://tools.ietf.org/html/rfc7230#section-5.4

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