Домашня » як » Чи підтримують веб-сервери лише один веб-сайт?

    Чи підтримують веб-сервери лише один веб-сайт?

    Коли ви вперше починаєте вчитися, як доменні імена, 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? Перегляньте повний потік обговорення тут.