Когато за пръв път започнете да научите как имената на домейни, IP адресите, уеб сървърите и уеб сайтовете съвпадат и работят заедно, това може да е малко объркващо или поразително от време на време. Как всичко е настроено да работи толкова гладко? Днешната публикация "Суперуслуги Q & A" има отговорите на въпросите на любознателен читател.
Днешната сесия за въпроси и отговори ни идва с любезното съдействие на SuperUser - подразделение на Stack Exchange - обединяване на уеб сайтове с въпроси и отговори.
Снимката е предоставена от Rosmarie Voegtli (Flickr).
Потребителят на четец на SuperUser3407319 иска да знае дали уеб сървърите съдържат само един уеб сайт:
Въз основа на това, което разбирам за DNS и свързването на име на домейн с IP адреса на уеб сървъра, в който се съхранява уебсайт, означава ли, че всеки уеб сървър може да съдържа само един уебсайт? Ако уеб сървърите поддържат повече от един уебсайт, как се разрешава всичко, за да мога да получа достъп до уебсайта, който искам, без никакви проблеми или смесвания?
Уеб сървърите поддържат ли само един уеб сайт или държат ли повече?
Сътрудникът на SuperUser Bob има отговора за нас:
По принцип браузърът съдържа името на домейна в 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 socket (IP адресът на клиента също е на разположение, но това се използва рядко, а понякога и за блокиране / филтриране)
- Заявеният порт от TCP гнездото
- Заявеното име на хост, както е посочено в заглавката на хоста от браузъра в заявката за HTTP
- Поисканият път
- Всякакви други заглавки ("бисквитки" и т.н.)
Както изглежда, че сте забелязали, най-често срещаната настройка за споделен хостинг в наши дни поставя няколко уебсайта на един IP адрес: пристанищна комбинация, оставяйки само хоста да прави разлика между уеб сайтове.
Това е известно като виртуален хост на базата на имена в Apache-land, докато Nginx ги нарича сървърни имена в сървърни блокове и IIS предпочита Virtual Server.
Какво е HTTPS?
HTTPS е малко по-различно. Всичко е идентично с установяването на TCP връзката, но след това трябва да се създаде шифрован TLS тунел. Целта е да не се изпуска информация за искането.
За да се увери, че уеб сървърът всъщност е собственик на този домейн, уеб сървърът трябва да изпрати сертификат, подписан от надеждна трета страна. След това браузърът сравнява този сертификат с домейна, който поиска.
Това представлява проблем. Как уеб сървърът знае кой сертификат за хост / уебсайт да изпрати, ако трябва да направи това преди да получи HTTP заявката?
Традиционно това беше решено, като имаше специален IP адрес (или порт) за всеки уеб сайт, изискващ HTTPS. Очевидно е, че това стана проблематично, тъй като ние използваме адресите на IPv4.
Въведете SNI (Индикация на име на сървър). Браузърът вече предава името на хоста по време на преговорите по TLS, така че уеб сървърът разполага с тази информация достатъчно рано, за да изпрати правилния сертификат. От страна на уеб сървъра, конфигурацията е много подобна на това как са конфигурирани HTTP виртуални хостове.
Недостатъкът е, че името на хоста вече е предадено като обикновен текст преди криптиране и е по същество изтекла информация. Това обикновено се счита за приемлив компромис, въпреки че разглеждането на името на хоста обикновено се показва в DNS заявка.
Какво да направите, ако заявите уеб сайт само по IP адрес?
Това, което прави уеб сървърът, когато не знае кой конкретен хост иска, зависи от внедряването и конфигурацията на уеб сървъра. Обикновено има специален уебсайт "default", "catch-all" или "fall back", който ще отговори на всички заявки, които не посочват изрично хост.
Този подразбиращ се уебсайт може да бъде неговият независим уебсайт (често показващ съобщение за грешка) или може да бъде някой от другите сайтове на уеб сървъра в зависимост от предпочитанията на администратора на уеб сървъра.
Имате ли нещо, което да добавите към обяснението? Звучи в коментарите. Искате ли да прочетете повече отговори от други потребители на Stack Exchange? Вижте цялата тема на дискусията тук.