Как веб-сервер определяет текущее значение ETag? - PullRequest
0 голосов
/ 21 июня 2019

Пример сценария

Скажем, есть ресурс на /some-view, который отображает список, основанный на запросе к базе данных, например

  • item 1
  • item 2
  • item 3

Клиент X делает первый запрос к /some-view, сервер обрабатывает ответ, кэширует его, генерирует etag и отправляет его обратно с 200.

Теперь прошло некоторое время, и список в /some-view включает в себя еще один элемент

  • элемент 1
  • элемент 2
  • элемент 3
  • item 4

Предполагается, что Клиент X снова отправляет первый запрос, будет ли сервер отвечать 304, пока другой запрос, например, Клиент Y, не вызовет генерацию нового значения etag или не выполнит ли серверна самом деле обработать ответ и сравнить его с текущим etag, чтобы определить, является ли он все еще действительным?Может быть, разные веб-серверы справляются с этим по-разному?

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Если ответ генерируется динамически, сервер фактически должен будет сгенерировать его, чтобы создать ETag и сравнить его с запросом.Если они совпадают, то сервер может избежать отправки ответа, но он не может избежать его генерации во-первых, по крайней мере, в общем случае (например, фильтр ETag), где ETag является просто хешем ответа,Конечно, ETag может быть любым, поэтому, хотя в общем случае сервер должен генерировать ответ, если вы создаете свой собственный ETag, вы включаете в него некоторую информацию, которую ваш сервер может использовать, чтобы выяснить, может ли он просто вернуть 304 безнеобходимость генерировать ответ.

0 голосов
/ 21 июня 2019

Существует 2 сценария ETag: ETag для статического ресурса (файлы) и ETag для результата динамического запроса (как описано в вопросе).

Если «веб-сервер» означает серверное программное обеспечение, такое как Apache или Nginx, оно предоставляет только функцию ETag для статического ресурса и не генерирует и не обновляет ETag автоматически для динамического результата. Например, согласно Nginx документ :

Синтаксис: etag on | выкл;

По умолчанию: etag on;

Включает или отключает автоматическую генерацию поля заголовка ответа «ETag» для статических ресурсов .

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

Если «веб-сервер» означает логику на стороне сервера, вы можете самостоятельно создавать и управлять ETag (например, отображением URL-адреса и соответствующего ETag). Единственное требование в связи с RFC7232 :

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

Таким образом, ключевым моментом здесь является «обнаружение изменений» - вы можете подобрать наиболее подходящее решение:

  • Прослушивание операции записи ресурса и обновление ETag.
  • Запросите ресурс каждые 5 минут в фоновом режиме и обновляйте ETag, если что-то изменилось.
  • Решение "Клиент Y", описанное в вопросе.
  • Решение «обработать и сравнить», описанное в вопросе.
  • подробнее ...

Пока решение может разумно и последовательно обнаруживать изменения, это хорошее решение.

...