2016-10-21 7 views
6

Я использую заголовок ETag для кэширования, и браузер отправляет соответствующий заголовок If-None-Match. Первоначально я просто сравнивал эти заголовки, и это сработало.Каково использование для If-None-Match с несколькими объектами?

Позже мне пришло в голову, что rfc2616 разрешает список сущностей, поэтому я исправил его. Вопрос в том, исправляется ли когда-либо когда-либо ...

  • Выполняется ли браузер когда-либо с заголовком If-None-Match, содержащим более одного объекта?
  • Есть ли другой реальный мир?
+0

Вы можете обратиться к [RFC 7230] (https://tools.ietf.org/html/rfc7230) фф. 2616 устарел уже довольно давно. Проблема все еще существует. Я займусь этим позже, звучит интересно :) – DaSourcerer

+0

Право на летучую мышь: Возможно, для этого нужны схемы управления версиями, такие как те, которые используются WebDAV. – DaSourcerer

ответ

1

Существует два варианта использования: объединение браузера и кэширование сущностей-прокси-серверов и пользовательская реализация кэширования на клиентской стороне.

Хотя, я никогда не видел, чтобы браузер обслуживал запрос с несколькими объектными тегами в If-None-Match, есть кеширующие прокси, у которых может быть собственная версия запрашиваемого ресурса. Они могут заменить значение If-None-Match, отправленное браузером с объединением версии сущности-тега ресурса браузера и тегом сущности ресурса прокси-сервера, прежде чем отправлять запрос дальше серверу. Таким образом, если прокси имеет новую версию запрашиваемого ресурса, вы можете уменьшить нагрузку на сервер, предоставляя полный ответ (с полезной нагрузкой тела) из прокси вместо сервера. Этот случай описывается RFC 7234 Hypertext Transfer Protocol (HTTP/1.1): Caching:

Когда кэш решает перепроверить свои сохраненные ответы на запрос, который содержит список If-None-Match сущностей-тег, кэш может объединить полученный список с список тегов-сущностей из собственного сохраненных наборов ответов (свежий или устаревший) и отправить объединение двух списков в качестве замены значения поля заголовка If-None-Match в перенаправленном запросе .

Я не могу сказать, является ли поддержка этой части RFC 7234 широкой, но, безусловно, есть прокси-серверы, которые ее поддерживают. Проверьте проект Node.js Caching Reverse HTTP Proxy от Колина Молленхора.

С другой стороны, вы можете не полагаться на браузер для выполнения условного запроса. Вы можете установить значение заголовка If-None-Match, используя XMLHttpRequest.setRequestHeader(). Это может быть полезно, если вы храните несколько версий ресурса, используя Web Storage API, Cache API или другой механизм. Ответ сервера должен содержать ETag HTTP-заголовок с тегом-сущностью. Этот тег entity указывает, какая версия ресурса считается свежей.

0

Недавно я много читал о механизмах кэширования и обнаружил, что задаю этот самый вопрос. Я могу думать только о случае использования (в дополнение к тем, о которых упомянул Леонид), где имеет смысл хранить и отправлять несколько ETags: когда ressource откаты.

Это может быть случайный, такой как api, который обслуживает json, а базовые данные часто обновляются, таким образом, что он восстанавливается до предыдущей версии.

Но это также может быть по дизайну, где большой объект конфигурации может иметь только несколько различных версий, которые могли бы переключиться на многое. (частота, с которой она будет изменена, важна, иначе кеширование не принесет большого значения).В этом случае кэши будут рады, что все доступные версии всегда готовы к обслуживанию.

Я знаю, что это длинный выстрел, и я не могу придумать никакой реальной ситуации, которая бы соответствовала одному из них. Кроме того, повторная аттестация сосать в любом случае, кеш-хиты - это путь: =)

Также вы можете прочитать this. Кажется, что в каждом кэше хранится только последний отправленный ETag (что понятно по очевидным причинам памяти).

Надеется, что это помогает