Каков полный процесс ввода URL-адреса в адресную строку браузера, чтобы получить отображаемую страницу в браузере?
Я думаю об этом вопросе в течение длительного времени. Это вопрос большой, поскольку он почти охватывает все углы, связанные с веб-разработкой.
В моем понимании, процесс должен выглядеть следующим образом:
- введите URL-адрес в адресную строку
- запрос будет отправлен на DNS-сервер на основе конфигурации вашей сети.
- DNS отправит вас к реальному IP-адресу доменного имени
- запрос (с полным заголовком Http) будет отправлен на сервер (с 3 IP-адресом для идентификации) 80-port (предположим, что мы не укажем другой порт)
- сервер будет выполнять поиск в портах прослушивания и перенаправлять запрос в приложение, которое слушает 80-й порт (скажем, nginx здесь) или на другой сервер (тогда 3-й сервер будет похож на балансировщик нагрузки)
- nginx будет пытаться сопоставить URL-адрес с его конфигурацией и напрямую ссылаться на статическую страницу или вызвать соответствующий script intepreter (например, PHP/Python) или другое приложение для получения динамического содержимого (с помощью запроса БД или другого логик)
- html будет отправлен обратно в браузер с полным заголовком ответа Http
- браузер будет анализировать DOM html, используя его синтаксический анализатор
- внешние ресурсы (JS/CSS/images/flash/videos..) будут запрашиваться последовательно (или нет?)
- для JS, он будет выполнен движком JS
- для CSS, он будет отображаться движком CSS, а отображение HTML будет скорректировано на основе CSS (также в последовательности или нет?)
- если в DOM есть iframe, то с этапа 1-12 будет выполняться отдельный процесс.
Это мое понимание, но я не знаю, правильно оно или нет? Насколько точны? Я что-то пропустил?
Если это правильно (или почти правильно), я надеюсь:
- Сделайте описание шага более точным в ваших словах или напишите ваши шаги, если есть большие изменения.
- Сделайте глубокое объяснение для каждого шага, с которым вы больше всего знакомы.
- Один ответ за шаг. Другие могут внести дополнения в каждый ответный комментарий.
И я надеюсь, что этот поток поможет всем веб-разработчикам лучше понять, что мы делаем каждый день.
И я обновлю этот вопрос на основе ответов.
Спасибо.
Ответы
Ответ 1
Как вы говорите, это широкий вопрос, где можно подробно остановиться на ряде тем. В последовательности, описанной вами, нет ничего плохого, но вы оставляете много деталей. Чтобы упомянуть несколько:
- Уровень DNS может помочь перенаправить клиентов на разные серверы на основе географического местоположения, чтобы помочь с балансировкой нагрузки и минимизацией времени ожидания, а один сервер может отвечать на запросы от разных DNS-имен.
- Браузер может выполнять различные типы запросов (GET, POST, HEAD и т.д.) и обычно включает несколько разных заголовков, включая файлы cookie, возможности браузера, языковые настройки и т.д.
- Большинство браузеров обычно поддерживают кеш, чтобы избежать многократно загружаемого материала и использовать различные методы, чтобы определить, действительна ли кешированная версия файла.
- В современных веб-страницах часто сложное взаимодействие между различными типами файлов (HTML, CSS, изображения, JavaScript, видео, Flash,...), а веб-разработчикам часто требуется подробное знание различий между браузерами, чтобы сохранить их страницы, работающие для всех
Каждый из этих тем и многое другое можно обсудить подробно. Возможно, более практично задавать более конкретные вопросы по интересующим вас темам?
Ответ 2
Здесь я могу описать одну точку -
Определение того, какой файл/ресурс необходимо выполнить, какой языковой интерпретатор загружается.
Извините меня, если я ошибаюсь в использовании интерпретатора здесь. В моем ответе могут быть и другие ошибки, я попытаюсь исправить их позже и включить правильные технические условия для вещей.
Когда веб-сервер (например, apache) получил URI, он проверяет, существует ли существующее правило перезаписи, соответствующее ему. В этом случае выполняется переписанный URI. В любом случае, если для завершения URI нет имени файла, загружается файл по умолчанию, который обычно является index.html или index.php и т.д. В соответствии с расширением имени файла соответствующий модуль apache для серверной части поддержка языка программирования загружается, например mod_php для PHP, mod_python в случае python. Соответствующий интерпретатор языка на стороне сервера (учитывая интерпретируемые языки, такие как PHP) затем готовит окончательный HTML или вывод в какой-либо другой форме для веб-сервера, который, наконец, отправляет его как ответ HTTP.
Ответ 3
Я также искал то же самое и нашел, что этот удивительный подробный ответ строится совместно github