В чем смысл If-Unmodified-Since/If-Modified-Since? Разве они не заменяются ETags?

Кажется, существуют два разных способа реализации условных запросов с использованием HTTP-заголовков, которые могут использоваться для кэширования, запросов диапазона, управления concurrency и т.д....:

  • If-Unmodified-Since и If-Modified-Since, где клиент отправляет временную метку ресурса.
  • If-Modified и If-None-Modified, где клиент отправляет представление ресурса ETag.

В обоих случаях клиент отправляет часть информации о ресурсе, которая позволяет серверу определить, изменился ли ресурс с момента последнего его просмотра клиентом. Затем сервер решает, выполнять ли запрос в зависимости от условного заголовка, предоставленного клиентом.

Я не понимаю, почему доступны два разных подхода. Разумеется, ETags заменяет временные метки, поскольку сервер может довольно легко выработать ETags с отметками времени.

Итак, мои вопросы:

  • В каких сценариях вы можете одобрить If-Unmodified-Since/If-Modified-Since через ETags?
  • В каких сценариях вам могут понадобиться оба?

Ответ 1

Я размышлял об одном и том же, и понял, что есть одна разница, которая очень важна: Даты можно заказать, ETags не может.

Это означает, что если какой-то ресурс был изменен год назад, но с тех пор и мы это знаем. Затем мы можем правильно ответить на запрос If-Unmodified-Since для произвольных дат в прошлом году и согласиться с тем, что это... он был неизменен с этой даты.

Этаг сравним только для тождества. Либо это одно и то же, или нет. Если у вас есть тот же ресурс, что и выше, и в течение года docroot был перемещен на новый диск и файловую систему, предоставляя все файлы новым inodes, но сохраняя даты модификации. И кто-то основывал ETags на номере inode файла. Тогда мы не можем сказать, что старый ETag все еще в порядке, не имея журнала прошлых-все-таки-ETags.

Таким образом, я не вижу их в качестве одного из них. Они предназначены для разных ситуаций. Либо вы можете легко получить дату последней модификации всех данных на странице, которую собираетесь подавать, или вы можете легко получить ETag за то, что вы будете обслуживать.

Если у вас есть динамическая веб-страница с данными из большого количества поисков db, может быть трудно сказать, что датируется последней модификацией, не создавая в базе данных множество дат модификации. Но вы всегда можете сделать контрольную сумму md5 на странице результатов.

При поддержке этих кеш-протоколов я определенно хочу использовать только один из них, ни один из них.

Ответ 2

Существует одна довольно большая разница: я могу использовать ETags только в том случае, если я уже спрашивал сервер в прошлом. Временные метки, OTOH, я могу составить, как я иду.

Ответ 3

Простая причина: обратная совместимость.

Ответ 4

ETag является специфичным для сервера - это означает, что если ваше приложение находится в веб-ферме, вы получите разные ETags на разных серверах веб-фермы. Поэтому в таком случае следует использовать If-Unmodified-Since/If-Modified-Since. Вы можете посмотреть более подробное объяснение на странице YSlow.