Насколько я понимаю, DNS связывает доменное имя с IP-адресом сервера, на котором хранится веб-сайт, означает ли это, что каждый сервер может содержать только один веб-сайт? Если они этого не делают, как при вызове IP-адреса сервера узнать, какой веб-сайт мне нужен, если их много на одном сервере?
80
Host:
заголовке. В случае общего хостинга провайдер может настроить веб-сервер так, чтобы он обрабатывал это различными способами (например, по умолчанию, перенаправлять на провайдера и т. Д.).Ответы:
В основном: браузер включает имя домена в запрос HTTP, поэтому веб-сервер знает, какой домен был запрошен, и может ответить соответствующим образом.
HTTP-запросы
Вот как происходит ваш типичный HTTP-запрос:
Пользователь предоставляет URL в форме
http://host:port/path
.Браузер извлекает часть URL-адреса узла (домена) и, при необходимости, преобразует ее в IP-адрес в процессе, известном как разрешение имен . Это преобразование может происходить через DNS, но это не обязательно (например, локальный
hosts
файл в общих ОС обходит DNS).Браузер открывает TCP-соединение с указанным портом или по умолчанию использует порт 80 для этого IP-адреса.
Браузер отправляет HTTP-запрос. Для HTTP / 1.1 это выглядит так:
(
Host
Заголовок является стандартным и требуется в HTTP / 1.1. Он не был указан в спецификации HTTP / 1.0, но некоторые серверы все равно поддерживают его.)Отсюда у веб-сервера есть несколько частей информации, которые он может использовать, чтобы решить, каким должен быть ответ. Обратите внимание, что один веб-сервер может быть связан с несколькими IP-адресами.
Host
браузером в заголовке HTTP-запроса.Как вы, наверное, заметили, в наши дни самая распространенная настройка общего хостинга - это размещение нескольких веб-сайтов на одном IP-адресе: комбинации портов, что
Host
позволяет различать только веб-сайты.Это называется виртуальным хостом на основе имен в Apache-land, в то время как Nginx называет их именами серверов в блоках серверов, а IIS предпочитает виртуальный сервер .
Как насчет HTTPS?
HTTPS немного отличается. Все идентично до установления соединения TCP, но после этого должен быть установлен зашифрованный туннель TLS. Цель состоит в том, чтобы не пропускать информацию о запросе.
Чтобы убедиться, что серверу действительно принадлежит этот домен, сервер должен отправить сертификат, подписанный доверенной третьей стороной. Браузер сравнивает этот сертификат с запрашиваемым доменом.
Это представляет проблему. Как сервер узнает, какой сертификат хоста (веб-сайта) отправить, если он должен сделать это до получения HTTP-запроса?
Традиционно это решалось с помощью выделенного IP-адреса (или порта) для каждого веб-сайта, требующего HTTPS. Очевидно, это становится проблематичным, когда у нас заканчиваются адреса IPv4.
Введите SNI (указание имени сервера). Браузер теперь передает имя хоста во время согласования TLS, поэтому сервер имеет эту информацию достаточно рано, чтобы отправить правильный сертификат. На стороне сервера конфигурация очень похожа на настройку виртуальных хостов HTTP.
Недостатком является то, что имя хоста теперь передается в виде обычного текста перед шифрованием, и это, по сути, утечка информации. Обычно это считается приемлемым компромиссом, учитывая, что имя хоста в любом случае обычно указывается в запросе DNS.
Что делать, если вы запрашиваете сайт только по IP-адресу?
То, что делает сервер, когда он не знает, какой конкретный хост вы запросили, зависит от реализации и конфигурации сервера. Обычно указывается сайт «по умолчанию», «catchall» или «запасной вариант», который будет предоставлять ответы на все запросы, которые явно не указывают хост.
Этот сайт по умолчанию может быть собственным независимым сайтом (часто с сообщением об ошибке) или любым другим сайтом на сервере, в зависимости от предпочтений администратора сервера.
источник
У меня есть это объяснение для нетехнических людей.
Джек, Джилл и Джо живут в общежитии, и у них нет мобильных телефонов.
В телефонной книге все они перечислены с одинаковым номером. (Запись)
Вы набираете номер, и кто-то поднимает трубку; Вы говорите: «Я хотел бы поговорить с Джилл», и вы получаете ее на линии.
Вместо A-записи (телефонный номер / IP-адрес) в телефонной книге, она может просто сказать «Общежитие X», тогда вы должны искать номер для общежития X далее. Это запись CNAME.
Если Джилл недоступна, вы можете получить
302 Джилл навещает Питера, позвони ему
400 Я не могу тебя понять.
451 Вы нарушаете свой запретительный ордер.
500 Наша телефонная система вышла из строя.
источник
Во-первых, вам нужно понять, что здесь есть ряд различных концепций.
Между этими вещами нет отношения один-к-одному. Один сервер может иметь несколько IP-адресов; несколько имен хостов могут указывать на один IP-адрес; одно имя хоста может указывать на несколько IP-адресов. Несколько сайтов могут быть под одним именем хоста. Один сайт может быть распределен по нескольким именам хостов.
В старые времена (HTTP 1.0 и ранее) каждое имя хоста, которое сервер хотел обрабатывать по-разному, должно было иметь свой собственный IP-адрес. Это было довольно расточительно.
HTTP 1.1 добавил
Host
заголовок как обязательное поле в запросе HTTP (IIRC некоторые поставщики ранее поддерживали это как расширение). Это сообщало серверу, какое имя хоста было запрошено, и, следовательно, позволяло ему обслуживать различный контент для разных имен хостов на одном и том же IP-адрес. Поддержка HTTP 1.1 в клиентах теперь повсеместна.К сожалению, SSL (позже TLS) добавил складку. Для установки сеанса SSL / TLS требуется, чтобы сервер представил клиенту сертификат, который покрывает запрошенное имя хоста, но HTTP-запрос не поступает до тех пор, пока не будет установлен сеанс SSL / TLS.
Можно использовать один сертификат для нескольких имен хостов, используя
SubjectAltName
поле или подстановочные знаки вCommonName
поле. Однако это создает административные проблемы, особенно если соответствующие имена хостов находятся в доменах с разными владельцами.Так TLS ввел расширение «указание имени сервера» (SNI). С этим расширением клиент отправляет запрошенное имя хоста серверу во время процедуры квитирования TLS. Затем сервер может представить соответствующий сертификат. К сожалению, хотя текущие версии всех основных реализаций SSL / TLS поддерживают SNI, старым версиям потребовалось много времени, чтобы выйти из строя.
источник
Ответ немного сложнее, чем некоторые из ответов сделали это. При выполнении поиска DNS вы ДОЛЖНЫ получить IP-адрес (
A
запись для IPv4,AAAA
для IPv6). Вы должны быть в состоянии открыть сокет через TCP / IP для связи, или все это терпит неудачу. Этот адрес может представлять сервер или балансировщик нагрузки. Это может даже представлять прокси. Например, если хост находится за CloudFlare, вы получаете адрес сервера CloudFlare. Настоящий сервер где-то еще. Это позволяет хосту избежать таких проблем, как атаки типа «отказ в обслуживании».Виртуальный хостинг - это то, о чем вы спрашиваете (некоторые другие вопросы касались этого, но не в деталях). Виртуальный хостинг принимает веб-запрос и просматривает имя хоста (то есть domain.com), чтобы определить, какой веб-сайт обслуживать. Таким образом, на HTTP-сервере Apache у вас будет такая конфигурация
Это упрощено, например. Поэтому мы советуем Apache прослушивать порт 80 любого IP-адреса (в современной виртуальной машине хост, на котором размещен IP-адрес вашей машины, может отличаться от действующего IP-адреса). Затем мы сообщаем ему, что это
domain.com
веб-сайт и в каком каталоге он находится. Затем мы можем повторять этот блок снова и снова, чтобы сказать Apache, что он обрабатывает разные сайты. Каждый веб-сервер поддерживает этот тип системы.Другим способом решения этой проблемы может быть указание веб-серверу направлять весь веб-трафик на один единственный программный скрипт (например, PHP, ASP.NET и т. Д.), А затем этот единственный скрипт будет определять, какой веб-сайт и страницу отображать.
источник
Используя DNS, вы можете назначить столько имен отдельным IP-адресам, сколько захотите (например, в файле hosts вы можете просто разделить каждое имя пробелами). Используя DNS-сервер, вы также можете назначить несколько IP-адресов одному имени . Это не ограничивается отношениями один к одному.
Веб-сервер знает, какой сайт обслуживать, изучив запрошенный URL. Он смотрит, какой домен был запрошен, какой порт был запрошен и какой протокол использовался. Это не имеет ничего общего с DNS и обрабатывается протоколом HTTP.
источник
Веб-сервер имеет концепцию хост-контейнера ( вот документация для Tomcat, например). Несколько хост-контейнеров могут быть настроены для одного и того же ящика / IP-адреса, обслуживая несколько доменов. Контейнеры имеют независимые рабочие каталоги, области аутентификации, каталоги журналов и тому подобное.
Сервер находит соответствующий контейнер для нового запроса на покупку, имя домена является частью этого HTTP-запроса.
Абсолютно разные экземпляры веб-сервера могут использовать один и тот же IP-адрес, если они работают на разных портах. В основном это используется в различных средах разработки и тестирования, где доменные имена могут быть недоступны, поскольку рабочий сервер не может работать на произвольном порту.
Наконец, даже если для веб-сайта требуется строго уникальный IP-адрес, серверный блок часто имеет несколько сетевых адаптеров, поэтому он настроен на использование нескольких IP-адресов.
источник
IP-адрес вашего сервера может содержать много разных доменных имен одновременно.
Когда вы заходите на веб-сайт, ваш браузер отправляет HTTP-запрос с именем домена, и сервер может найти данные веб-сайта, которые он должен отправить вам тогда.
Это называется виртуальные хосты, все так просто :)
Посмотрите здесь для получения дополнительной информации о DNS и виртуальных хостах.
источник