В чем может быть разница между if-modified-Since и if-none-match? У меня такое ощущение, что if-none-match используется для файлов, тогда как if-modified-Since используется для страниц?
Ответы:
Что касается различий между Last-Modified/If-Modified-Since
и ETag/If-None-Match
:
Оба могут использоваться как взаимозаменяемые. Однако в зависимости от типа ресурса и того, как он генерируется на сервере, может быть легче ответить на тот или иной вопрос («было ли это изменено с тех пор ...?» / «Соответствует ли он этому ETag?») .
Примеры:
mtime
качестве Last-Modified
даты является самым простым решением.ETag
будет намного проще использовать, например, md5-хэш содержимого страницы . Смотрите эти ссылки для более подробной информации по теме:
If-Modified-Since
сравнивается с Last-Modified
тогда If-None-Match
как сравнивается с ETag
. Оба Modified-Since
и ETag
могут использоваться для идентификации конкретного варианта ресурса.
Но сравнение If-Modified-Since
to Last-Modified
дает вам информацию о том, является ли кешированный вариант более старым или новым, тогда как сравнение If-None-Match
to ETag
просто дает вам информацию, идентичны ли оба варианта или нет. Кроме того, большинство ETag
генераторов включают информацию об индексном дескрипторе системы, поэтому перемещение файла на другой диск также может изменить его ETag
.
Значение отметки времени, используемое в Last-Modified / If-Modified-Since, имеет ограниченную точность - одну секунду, и этого просто недостаточно для быстрого изменения контента, как, например, приложение веб-чата, где в любую секунду может быть опубликовано более одного сообщения. . ETag / If-None-Match может помочь решить эту проблему.
Как указано в лучших практиках Google:
Важно указать один из max-age Expires или Cache-Control и один из Last-Modified или ETag для всех кэшируемых ресурсов. Избыточно указывать и Expires, и Cache-Control: max-age, или указывать и Last-Modified, и ETag.
https://developers.google.com/speed/docs/best-practices/caching
Last-Modified
with ETag
(или со стороны пользователя-агента If-Modified-Since
with If-None-Match
) не упоминается. Точно так же спецификация W3 вас не ограничивает. Он говорит, что не использовать If-Modified-Since
с If-Match
, но я предполагаю, что это потому, что набор документов, которые имеют обновленные даты, но такое же содержимое, как определено ETag, должен быть довольно небольшим.
If-Modified-Since использует дату, а If-None-Match использует ETag . Оба они могут использоваться для «страниц» (например, HTML) и других файлов.
Если сервер не указал как слабый, ETag считается сильным валидатором и, таким образом, может использоваться для удовлетворения условного ранжированного запроса. Однако большинство автоматически сгенерированных тегов ETag вызывают трудности в ситуациях фермы серверов, поскольку они часто используют информацию об индексах и / или уникальный постоянный счетчик. На практике я обнаружил, что заголовка Last Modified достаточно для довольно статического содержимого, например, для обслуживания защищенного статического содержимого, поскольку время записи файла является достаточно хорошим валидатором.
ETag, безусловно, самый гибкий. Соответствующие клиенты должны отправлять ETag в условном запросе, тогда как они ДОЛЖНЫ отправлять оба, если они доступны.
Заголовок If-Modified-Since используется для указания времени, когда браузер последний раз получил запрошенный ресурс. Заголовок If-None-Match используется для указания тега объекта, выданного сервером с запрошенным ресурсом при его последнем получении.
Двумя описанными способами эти заголовки используются для поддержки кэширования контента в браузере, и они позволяют серверу инструктировать браузер использовать кэшированную копию ресурса, вместо того, чтобы отвечать с полным содержимым ресурса, если это так. не обязательно.