If-Range
Применение
Клиенты используют If-Range при возобновлении частичной загрузки или при получении конкретного диапазона байтов ресурса, полученного ранее. Заголовок содержит в качестве валидатора либо значение ETag, либо дату Last-Modified. В одном запросе допустима только одна из форм.
Ключевое отличие от If-Match — в том, что происходит при невыполнении условия. Неудача If-Match приводит к ошибке 412 Precondition Failed и останавливает запрос. Неудача If-Range завершается корректно: сервер игнорирует заголовок Range и возвращает ресурс целиком со статусом 200. Это делает If-Range безопаснее для возобновления загрузки, поскольку клиент всегда получает пригодные к использованию данные.
Условный запрос с If-Range требует наличия заголовка Range в том же запросе. Без заголовка Range сервер полностью игнорирует If-Range.
entity-tag
Значение ETag, ранее полученное от сервера. Значение представляет собой строку в кавычках и должно быть строгим валидатором: слабые ETag с префиксом W/ в If-Range не допускаются.
If-Range: "abc123"
HTTP-date
Отметка времени Last-Modified в стандартном формате даты HTTP. Сервер сравнивает эту дату с текущей датой изменения ресурса.
If-Range: Wed, 01 Jun 2022 08:00:00 GMT
Примечание
Заголовок If-Range содержит либо ETag, либо дату. Обе формы в одном запросе не допускаются.
Пример
Клиент ранее загрузил часть большого файла и получил ETag вместе с первоначальным ответом. Чтобы возобновить загрузку с байта 1048576, клиент отправляет и заголовок Range, и заголовок If-Range с сохранённым ETag. Если файл не изменился, сервер отвечает 206 Partial Content.
GET /releases/archive.tar.gz HTTP/1.1
Host: cdn.example.re
Range: bytes=1048576-
If-Range: "a1b2c3d4e5"
Когда ресурс изменился со времени первоначальной загрузки, ETag больше не совпадает. Сервер отбрасывает Range и отвечает полным файлом со статусом 200.
HTTP/1.1 200 OK
Content-Length: 52428800
ETag: "f6g7h8i9j0"
Валидатор на основе даты работает так же. Этот запрос возобновляет загрузку только в том случае, если файл не изменялся с указанной отметки времени.
GET /data/export.csv HTTP/1.1
Host: api.example.re
Range: bytes=524288-
If-Range: Sat, 15 Feb 2025 12:00:00 GMT