если модифицированный-с против если-нет-матч


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

6 83

6 ответов:

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

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

примеры:

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

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

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

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

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

Как указано в лучших практиках google:

важно указать один из Expires или Cache-Control max-age и один из Last-Modified или ETag для всех кэшируемых ресурсов. Она является избыточной, чтобы указать, как истекает и Кэш-контроль: Макс-возраст, или указать последнего изменения и ETag.

https://developers.google.com/speed/docs/best-practices/caching

If-Modified-Since использует дату, в то время как Если-Нет-Матч использует ETag. Они могут использоваться как для" страниц " (т. е. HTML), так и для других файлов.

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

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