В чем может быть разница между 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-Sinceto Last-Modifiedдает вам информацию о том, является ли кешированный вариант более старым или новым, тогда как сравнение If-None-Matchto 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-Modifiedwith ETag(или со стороны пользователя-агента If-Modified-Sincewith 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 используется для указания тега объекта, выданного сервером с запрошенным ресурсом при его последнем получении.
Двумя описанными способами эти заголовки используются для поддержки кэширования контента в браузере, и они позволяют серверу инструктировать браузер использовать кэшированную копию ресурса, вместо того, чтобы отвечать с полным содержимым ресурса, если это так. не обязательно.