Чи підтримують веб-сервери лише один веб-сайт?
Коли ви вперше починаєте вчитися, як доменні імена, IP-адреси, веб-сервери та веб-сайти підходять і працюють разом, це може бути трохи заплутаним або приголомшливим часом. Як все налаштовано працювати так гладко? Сьогоднішня посада SuperUser Q&A має відповіді на запитання цікавого читача.
Сьогоднішня сесія запитань та відповідей приходить до нас люб'язно SuperUser - підрозділ Stack Exchange, групування веб-сайтів із запитаннями та відповідями на рівні спільноти..
Фото люб'язно надано Rosmarie Voegtli (Flickr).
Питання
Читач SuperUser user3407319 хоче знати, чи підтримують веб-сервери лише один веб-сайт:
Виходячи з того, що я розумію про DNS і пов'язуючи доменне ім'я з IP-адресою веб-сервера, на якому зберігається веб-сайт, чи означає це, що кожен веб-сервер може мати тільки один веб-сайт? Якщо веб-сервери утримують більше одного веб-сайту, то як це все вирішується, щоб я мав доступ до потрібного веб-сайту без будь-яких проблем або мікстури?
Чи підтримують веб-сервери лише один веб-сайт, або вони мають більше?
Відповідь
Співробітник SuperUser Боб має відповідь для нас:
В основному, браузер включає в себе доменне ім'я в HTTP-запиті, так що веб-сервер знає, який домен був запитаний і може відповідати відповідним чином.
Запити HTTP
Ось як виконується типовий запит HTTP:
1. Користувач надає URL, у формі http: // host: port / path.
2. Браузер витягує частину URL (домен) хосту та переводить її у IP-адресу (якщо необхідно) у процесі, відомому як розділення імен. Цей переклад може відбуватися через DNS, але його не потрібно (наприклад, файл локальних хостів на звичайних операційних системах обходить DNS).
3. Браузер відкриває TCP-з'єднання до вказаного порту або за замовчуванням порту 80 на цій IP-адресі.
4. Браузер надсилає HTTP-запит. Для HTTP / 1.1 це виглядає так:
Заголовок хоста стандартний і необхідний в HTTP / 1.1. В специфікації HTTP / 1.0 вона не вказана, але деякі сервери підтримують її.
Звідси веб-сервер має кілька відомостей, які він може використовувати для вирішення того, яким має бути відповідь. Зауважте, що один веб-сервер може бути прив'язаний до декількох IP-адрес.
- Запитувана IP-адреса з сокета TCP (також доступна IP-адреса клієнта, але це рідко використовується, а іноді для блокування / фільтрації)
- Запитуваний порт з TCP-сокету
- Запитане ім'я хоста, як вказано в заголовку вузла браузером в HTTP-запиті
- Запитаний шлях
- Інші заголовки (файли cookie тощо)
Як ви, мабуть, помітили, найчастіше в даний час встановлюється декілька веб-сайтів на одній IP-адресі: поєднання портів, що дозволяє лише розрізняти веб-сайти.
Це відоме як віртуальний хост на основі імені в Apache-land, тоді як Nginx називає їх іменами серверів в серверних блоках, а IIS надає перевагу віртуальному серверу.
Що стосується HTTPS?
HTTPS трохи відрізняється. Все ідентично до встановлення з'єднання TCP, але після цього повинен бути встановлений зашифрований TLS-тунель. Мета полягає в тому, щоб не пропускати будь-яку інформацію про запит.
Щоб переконатися, що веб-сервер фактично володіє цим доменом, веб-сервер повинен надіслати сертифікат, підписаний довіреною третьою стороною. Після цього браузер порівнюватиме цей сертифікат із запитаним доменом.
Це є проблемою. Як веб-сервер знає, який сертифікат хосту / веб-сайту потрібно надіслати, якщо він повинен це зробити, перш ніж буде отриманий HTTP-запит?
Традиційно це вирішувалося за допомогою спеціальної IP-адреси (або порту) для кожного веб-сайту, який потребував HTTPS. Очевидно, що це стало проблематичним, оскільки нам не вистачає адрес IPv4.
Введіть SNI (індикація назви сервера). Браузер тепер передає ім'я хоста під час переговорів TLS, тому веб-сервер має цю інформацію досить рано, щоб надіслати правильний сертифікат. На стороні веб-сервера конфігурація дуже схожа на налаштування віртуальних хостів HTTP.
Недоліком є ім'я хоста, який тепер передається як звичайний текст перед шифруванням, і є по суті просоченою інформацією. Як правило, це вважається прийнятним компромісом, хоча, зважаючи на те, що ім'я хосту зазвичай виставляється в запиті DNS, так чи інакше.
Що робити, якщо ви запитуєте веб-сайт тільки за IP-адресою?
Що робить веб-сервер, коли він не знає, який конкретний хост ви запитували, залежить від реалізації та налаштування веб-сервера. Як правило, вказаний веб-сайт "за замовчуванням", "охоплює все" або "відступати", який забезпечує відповіді на всі запити, які явно не вказують хост.
Цей веб-сайт за умовчанням може бути власним незалежним веб-сайтом (часто відображається повідомлення про помилку), або це може бути будь-який з інших веб-сайтів на веб-сервері залежно від уподобань адміністратора веб-сервера.
Маєте щось додати до пояснення? Звучить в коментарях. Хочете прочитати більше відповідей від інших технологічних користувачів Stack Exchange? Перегляньте повний потік обговорення тут.