Употребление etags и кодирование в одно и то же время?

обновленный вопрос

Как мое приложение может использовать etags, и вводит ли потоковое кодирование или кодирование с чередованием какие-либо осложнения?


оригинальный вопрос

При выполнении потоковой передачи HTTP с помощью Transfer-Encoding: chunked, Content-Length не может быть отправлено, потому что часто не известно.

Насколько я понимаю, когда браузеры используют etags, они требуют знания Content-Length. Если предоставляется этаг, но не Content-Length, браузеры никогда не отправят If-None-Match.

Есть ли способ обойти это?

Ответ 1

Что такое теги сущностей?

Etags - это http-заголовки, используемые для страниц версии, и позволяет клиенту повторно использовать ранее сохраненные копии страницы, если страница не изменилась.

Основная идея заключается в том, что клиент переходит на страницу и отправляет HTTP-запрос на сервер, на котором есть страница. Затем сервер отображает страницу и возвращает ответ клиенту вместе с этагом, который имеет некоторое значение. В дополнение к показу страницы клиент будет копировать копию этой страницы в свой локальный кеш вместе с etag. В следующий раз, когда клиент посещает эту страницу, клиент отправляет запрос на веб-сервер, но включает в себя этаг в заголовке If-None-Match. Такой запрос известен как условный GET. Клиент говорит: "Мне нужна эта страница, однако у меня уже есть кешированная версия страницы с этим значением etag, поэтому, если вы считаете, что моя кэшированная версия в настоящее время, просто скажите мне это, и я просто покажу свой кешированная копия пользователю".

Для значения etag нет семантических требований. Он должен использоваться для хранения значения, которое позволяет определить, действительно ли копия клиентов обновлена.

Самый простой способ сделать это - вычислить хэш вашего ответа, и если хеш соответствует значению etag в заголовках запроса, тогда клиент уже имеет идентичную копию, и вы можете вернуть 304 No content и вернуть пустой тело в ответе. Это намного быстрее, чем возвращение всей страницы снова.

Оптимизация

При вычислении хэша это простой и безопасный способ определить, все еще ли кеш-память, существуют более интеллектуальные методы, которые позволят вам снизить нагрузку на ваш веб-сервер. Рассмотрим страницу, отображающую продукт в интернет-магазине. Вместо того, чтобы отображать страницу с описанием продукта, а затем вычислять и сравнивать хэш, вы можете просто использовать атрибут updated_at продукта. Это означает, что первое, что вы делаете в своем приложении, - это проверить файл etag и извлечь продукт из базы данных, чтобы сравнить атрибут updated_at. Если это соответствует, вы предполагаете, что информация о продукте не была изменена, и вы можете завершить обработку запроса, не делая ничего дальше, а затем вернуть ответ 304 No content.

Однако вы должны быть осторожны с такой оптимизацией, поскольку на странице может быть добавлен дополнительный контент, который может устаревать без влияния на атрибут updated_at продукта в вашей базе данных. Это может быть боковая панель с последними новостями или, что еще хуже, персонализированная часть страницы, например, корзина с корзиной ранее добавленных продуктов.

Блокированное кодирование

Chunked encoding - это просто метод передачи ответа в нескольких фрагментах, поэтому получающий клиент может начать рендеринг страницы быстрее, пока сервер все еще работает с оставшимися фрагментами. Это не имеет никакого отношения к кешированию. Однако, если вы хотите использовать хешированное значение ответа в качестве этага, это, очевидно, невозможно, поскольку заголовки отправляются, прежде чем вы узнаете полный ответ, который необходим для вычисления хеша.