103 Early Hints
Применение
Когда сервер отправляет 103 Early Hints, клиент интерпретирует заголовки Link и заранее загружает указанные ресурсы. Это особенно полезно, когда серверу нужно время на обработку запроса перед формированием финального ответа. Пока сервер работает, клиент тратит время на загрузку таблиц стилей, изображений или скриптов, необходимых итоговой странице.
Примечание
Несколько ответов 103 Early Hints отправляются до финального HTTP-ответа.
Подсказки не являются гарантиями
В любой системе, опирающейся на предсказание, точность бывает разной. Когда сервер возвращает 103 Early Hints, предлагая клиенту получить определённые ресурсы, это предложение основано на разумном предположении. Авторитетные заголовки Link предоставляет только финальный HTTP-ответ.
Расхождение между подсказками и финальными заголовками проявляется двумя способами: финальному ответу требуются дополнительные ресурсы, не упомянутые в подсказках, либо ресурсы, загруженные по ранним подсказкам, оказываются ненужными. Во втором случае клиент выполнил лишнюю работу без какой-либо пользы, и общее время транзакции увеличивается.
Операции, выполняемые на основании ранних подсказок, безопасны. Например, использование метода GET не изменяет состояние сервера.
Влияние на SEO
103 Early Hints — информационный ответ, предшествующий финальному коду состояния. Поисковые сканеры обрабатывают финальный ответ, а не промежуточные информационные ответы. Прирост производительности от ранних подсказок относится к браузерам, а не к сканерам. Этот код состояния безопасен в использовании и не мешает тому, как Google обрабатывает страницу.
Замена server push
Механизм 103 Early Hints рассматривается как замена механизма server push в современных браузерах, в рамках системы подсказок о ресурсах с использованием rel=preload. В отличие от server push, 103 Early Hints не зависит от финального ответа: браузер начинает получать указанные ресурсы, не дожидаясь его.
Примечание
В целях безопасности браузеры разрешают использование 103 Early Hints только для соединений HTTP/2 и HTTP/3.
Пример
Клиент запрашивает файл index.html, и сервер возвращает три подсказки о ресурсах, которые, вероятно, понадобятся. Запрошенного файла нет в теле сообщения, потому что сервер всё ещё формирует ответ. Клиент начинает загружать ресурсы, указанные в каждой директиве Link.
После небольшой задержки сервер возвращает финальный ответ 200 вместе с официальными директивами Link и index.html в теле сообщения. Обратите внимание на различия между ранними подсказками и итоговым списком ресурсов.
Запрос
GET /index.html HTTP/1.1
Host: example.com
Ответ
HTTP/1.1 103 Early Hints
Link: </style.css>; rel=preload; as=style
Link: </images/logo.svg>; rel=preload; as=image
Link: </videos/instructions_simple.mp4>; rel=preload; as=video
<there is a short pause in the transmission>
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 100
Link: </style.css>; rel=preload; as=style
Link: </images/logo.svg>; rel=preload; as=image
Link: </images/pro_badge.svg>; rel=preload; as=image
Link: </videos/instructions_advanced.mp4>; rel=preload; as=video
<message body will follow>
Первый ресурс из ранних подсказок, style.css, загружается и обрабатывается клиентом вместе с изображением логотипа и видео instructions_simple.mp4. И таблица стилей, и логотип пригодны к использованию как есть. Изображение pro_badge из финального ответа в подсказках не фигурирует, поэтому клиент загружает этот ресурс уже после получения финального ответа.
Видео instructions_advanced.mp4 в финальных заголовках Link отличается от указанного в ранней подсказке. Сервер предложил instructions_simple.mp4 через ранние подсказки, но эта загрузка оказалась ненужной. Вновь указанное видео всё равно нужно загрузить и обработать, прежде чем index.html отрисуется полностью, что, вероятно, увеличит время загрузки, поскольку было загружено два видео вместо одного.
Примеры кода
.NET
HttpStatusCode.EarlyHints
Rust
http::StatusCode::EARLY_HINTS
Rails
:early_hints
Go
http.StatusEarlyHints
Symfony
Response::HTTP_EARLY_HINTS
Python3.9+
http.HTTPStatus.EARLY_HINTS
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_EARLY_HINTS
Angular
@angular/common/http/HttpStatusCode.EarlyHints