2012-08-03 2 views
3

Я использую WebDav для размещения метаданных в файлах и папках сервера вместе с кешем, чтобы избежать ненужных запросов на сервер, исходя из свойства ETag файлов.Обновление HTTP ETag

В принципе, я посылаю запрос HEAD и проверяю, соответствует ли ETag тому, что у меня есть на местном. Если это не так, я отправляю более крупный медленный метод PROPFIND для получения других свойств.

Я построил этот кеш на идее, что ETag был изменен каждый раз, когда файл был изменен, в том числе, когда метаданные были изменены, добавлены или удалены.

Однако недавно я обнаружил, что это не так:

Поскольку клиенты могут быть вынуждены запрашивать у пользователей или выбросить изменил содержание, если изменения Etag, сервер WebDAV не должен изменить ETag (или Last-Modified time) для ресурса с неизменным корпусом и местоположением . ETag представляет состояние тела или содержимое ресурса. Нет аналогичного способа узнать, изменились ли свойства ..

(RFC 4918, http://www.webdav.org/specs/rfc4918.html#etag, курсив мой)

Поскольку недействительности кэша, когда свойства изменяются очень важно для меня, мне было интересно: есть ли способ, чтобы вручную поручить веб-сервер для обновления ETag ?

ответ

2

Существует несколько различных вариантов. Если etag создается на основе содержимого (плохая идея), то это сложнее. В нашем решении мы сгенерировали другой тег (ptag), который мы обновили при изменении свойств, и вы можете запросить его с помощью PROPFIND, и мы вернули его как заголовок X-PTag ответа. Если этаг генерируется случайным образом на PUT, вы можете снова выставить те же данные, и это даст вам новый etag.

Смежные вопросы