Обновление HTTP ETag
Я использую WebDav для размещения метаданных в файлах и папках сервера вместе с кешем, чтобы избежать ненужных запросов к серверу на основе свойства ETag файлов.
По сути, я отправляю запрос HEAD и проверяю, совпадает ли ETag с тем, который есть у меня в локальной сети. Если этого не произойдет, то я отправлю более крупный, более медленный метод PROPFIND, чтобы получить другие свойства.
Я построил этот кеш на идее, что ETag менялся каждый раз, когда файл был изменен, в том числе, когда метаданные были изменены, добавлены или удалены.
Однако недавно я обнаружил, что это не так:
Поскольку клиенты могут быть вынуждены запрашивать пользователей или выбрасывать измененное содержимое в случае изменения ETag, сервер WebDAV не должен изменять ETag (или время последнего изменения) для ресурса, который имеет неизменное тело и местоположение. ETag представляет состояние тела или содержимого ресурса. Нет аналогичного способа узнать, изменились ли свойства.
(RFC 4918, http://www.webdav.org/specs/rfc4918.html, выделено мое)
Поскольку для меня важна аннулирование кэша при каждом изменении свойств, мне было интересно: есть ли способ вручную дать указание веб-серверу обновить ETag?
1 ответ
Есть пара разных вариантов. Если etag генерируется на основе контента (плохая идея), то это сложнее. В нашем решении мы сгенерировали другой тег (ptag), который мы обновляли при изменении свойств, и вы можете запросить его с помощью PROPFIND, и мы вернули его в виде заголовка X-PTag в ответе. Если etag генерируется случайным образом на PUT, вы можете снова поставить те же данные, и это даст вам новый etag.