если-изменено-с против-если-нет-совпадения


89

В чем может быть разница между if-modified-Since и if-none-match? У меня такое ощущение, что if-none-match используется для файлов, тогда как if-modified-Since используется для страниц?

Ответы:


112

Что касается различий между Last-Modified/If-Modified-Sinceи ETag/If-None-Match:

Оба могут использоваться как взаимозаменяемые. Однако в зависимости от типа ресурса и того, как он генерируется на сервере, может быть легче ответить на тот или иной вопрос («было ли это изменено с тех пор ...?» / «Соответствует ли он этому ETag?») .

Примеры:

  • Если вы обслуживаете файлы, использование файла в mtimeкачестве Last-Modifiedдаты является самым простым решением.
  • Если вы обслуживаете динамическую веб-страницу, созданную из ряда SQL-запросов, проверка того, изменились ли данные, возвращаемые каким-либо из этих запросов, может быть непрактичной (если у всех из них нет какого-либо столбца «последнее изменение»). В этом случае ETagбудет намного проще использовать, например, md5-хэш содержимого страницы .
    OTOH, это означает, что вам все равно придется сгенерировать всю страницу на сервере, даже для условного GET. Определение того, что именно должно быть помещено в ETag (первичные ключи, номера ревизий и т. Д.), Может сэкономить вам здесь много времени.

Смотрите эти ссылки для более подробной информации по теме:


Я отправил браузеру ETag, но он никогда не запрашивает ту же страницу с If-None-Match. В чем может быть проблема?
Pacerier

2
@pacerier: браузеры не обязаны использовать Etag. Так что это может быть старый браузер, который просто игнорирует его. Другая возможность заключается в том, что к объекту обращаются с параметрами URL, которые меняются от вызова к вызову. Если имя объекта изменится, etag не будет использоваться для разных запросов.
Рафаэль Баптиста

@RafaelBaptista Чтобы подробнее рассказать о вашей второй половине комментария, скажем, у меня есть такая ситуация: у меня есть файловый сервер, и сервер поддерживает управление версиями с использованием ETags, и по причинам обратной совместимости у нас раньше клиенты использовали параметр запроса my_current_version = (version ). Если я отправлю HTTP-запрос с разными значениями my_current_version, но также и с ETags, то какой критерий, как лучший метод, будет иметь приоритет при определении того, следует ли обслуживать новую версию или отправить обратно 304? Благодарность!
смеющийся_man

1
Как сервер использует Etag, зависит от сервера. Вы, вероятно, можете настроить большинство файловых серверов на игнорирование параметров с помощью etag, если хотите, с помощью правил перезаписи. У вас меньше контроля над клиентом - браузером. Большинство не будет отправлять заголовок etag, который они получили для одного набора параметров в запросе для другого. Клиентский запрос для изображения? V = 1 не будет отправлять тот же etag для изображения? V = 2. Если бы я писал свои собственные серверы, я бы реализовал etag как хэш содержимого изображения. Любой URL-адрес, который запрашивает ресурс и поставляется с etag, который соответствует хешу изображения, которое я отправляю, я возвращаю 304.
Рафаэль Баптиста,

22

If-Modified-Sinceсравнивается с Last-Modifiedтогда If-None-Matchкак сравнивается с ETag. Оба Modified-Sinceи ETagмогут использоваться для идентификации конкретного варианта ресурса.

Но сравнение If-Modified-Sinceto Last-Modifiedдает вам информацию о том, является ли кешированный вариант более старым или новым, тогда как сравнение If-None-Matchto ETagпросто дает вам информацию, идентичны ли оба варианта или нет. Кроме того, большинство ETagгенераторов включают информацию об индексном дескрипторе системы, поэтому перемещение файла на другой диск также может изменить его ETag.


Интересно, но почему я должен использовать «идентичные» проверки вместо проверок «последних изменений»? Каковы преимущества? Если у вас есть файл для обслуживания, какой вариант лучше?
Tower

7
У компьютеров время хрупкое. Дополнительные секунды, переключение между переходом на летнее время и неточные часы - все это может привести к тому, что проверка «последнего изменения» вернет неверный результат. Сравнение самого содержимого (или MD5-хэша содержимого) позволяет избежать этих проблем.
devdanke

Несмотря на то, что я полностью понимаю @devdanke, я бы сказал, что проверка отметки времени намного быстрее, чем проверка md5sum. Цель этих заголовков - сделать это быстро, иногда предпочтительнее не передавать новую версию объекта клиенту, чем загружать сервер с помощью ввода-вывода. В любом случае, пользователь всегда может нажать ctrl + shift + R (или ctrl + F5 или что-то еще)
Grief

13

Значение отметки времени, используемое в Last-Modified / If-Modified-Since, имеет ограниченную точность - одну секунду, и этого просто недостаточно для быстрого изменения контента, как, например, приложение веб-чата, где в любую секунду может быть опубликовано более одного сообщения. . ETag / If-None-Match может помочь решить эту проблему.


9

Как указано в лучших практиках 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


в этом URL-адресе больше нет текста, похожего на этот. Никаких ограничений на использование Last-Modifiedwith ETag(или со стороны пользователя-агента If-Modified-Sincewith If-None-Match) не упоминается. Точно так же спецификация W3 вас не ограничивает. Он говорит, что не использовать If-Modified-Sinceс If-Match, но я предполагаю, что это потому, что набор документов, которые имеют обновленные даты, но такое же содержимое, как определено ETag, должен быть довольно небольшим.
mpag


3

Если сервер не указал как слабый, ETag считается сильным валидатором и, таким образом, может использоваться для удовлетворения условного ранжированного запроса. Однако большинство автоматически сгенерированных тегов ETag вызывают трудности в ситуациях фермы серверов, поскольку они часто используют информацию об индексах и / или уникальный постоянный счетчик. На практике я обнаружил, что заголовка Last Modified достаточно для довольно статического содержимого, например, для обслуживания защищенного статического содержимого, поскольку время записи файла является достаточно хорошим валидатором.

ETag, безусловно, самый гибкий. Соответствующие клиенты должны отправлять ETag в условном запросе, тогда как они ДОЛЖНЫ отправлять оба, если они доступны.


0

Заголовок If-Modified-Since используется для указания времени, когда браузер последний раз получил запрошенный ресурс. Заголовок If-None-Match используется для указания тега объекта, выданного сервером с запрошенным ресурсом при его последнем получении.

Двумя описанными способами эти заголовки используются для поддержки кэширования контента в браузере, и они позволяют серверу инструктировать браузер использовать кэшированную копию ресурса, вместо того, чтобы отвечать с полным содержимым ресурса, если это так. не обязательно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.