If-Unmodified-Since
Применение
Клиенты добавляют If-Unmodified-Since, чтобы не перезаписать изменения, сделанные другими. Самый распространённый сценарий — запрос HTTP PUT или DELETE, когда клиенту нужна уверенность, что ресурс остаётся в состоянии, наблюдавшемся ранее. Если другой клиент изменил ресурс после даты, указанной в заголовке, сервер отклоняет запрос ответом 412 Precondition Failed.
Это решает проблему потерянного обновления. Два клиента получают один и тот же ресурс, оба вносят правки и оба отправляют обновления. Без предусловия второе обновление молча перезаписывает первое. Добавление If-Unmodified-Since во второй запрос гарантирует, что сервер обнаружит конфликт.
Значение заголовка использует формат даты HTTP. Сервер сравнивает эту дату с временной меткой Last-Modified ресурса. Когда дата изменения ресурса равна значению в If-Unmodified-Since или раньше него, условие выполняется и сервер продолжает обработку.
Для более строгих гарантий согласованности предпочтительнее If-Match со значением ETag. ETag обеспечивают точность до байта, тогда как условия на основе даты имеют разрешение в одну секунду.
HTTP-date
Значение следует формату IMF-fixdate. Дата обозначает самое позднее допустимое время изменения ресурса.
If-Unmodified-Since: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
Пример
Клиент получил документ 15 февраля 2025 года и теперь отправляет обновление. Значение If-Unmodified-Since совпадает с датой Last-Modified, полученной в исходном ответе. Если документ изменился после этой временной метки, сервер отвечает 412 Precondition Failed.
PUT /docs/report.json HTTP/1.1
Host: api.example.re
Content-Type: application/json
If-Unmodified-Since: Sat, 15 Feb 2025 10:30:00 GMT
В сочетании с запросом Range при частичной загрузке If-Unmodified-Since гарантирует, что базовый ресурс не изменился между фрагментами.
PATCH /files/dataset.csv HTTP/1.1
Host: api.example.re
If-Unmodified-Since: Fri, 14 Feb 2025 08:00:00 GMT
Content-Range: bytes 0-1023/4096