Использование etags и chunked-кодировки одновременно?
обновленный вопрос
Как мое приложение может использовать etags, и не представляет ли введение потокового / чанкового кодирования какие-либо сложности?
оригинальный вопрос
При выполнении потоковой передачи HTTP с Transfer-Encoding: chunked
, Content-Length
не может быть отправлено, потому что это часто неизвестно.
Насколько я понимаю, когда браузеры используют etags, они требуют знания Content-Length
, Если указан etag, но нет Content-Length
, браузеры никогда не отправят If-None-Match
,
Это можно обойти?
1 ответ
Что такое теги сущностей?
Etags - это заголовки http, используемые для создания версий страниц и позволяющие клиенту повторно использовать ранее кэшированные копии страницы, если страница не изменилась.
Основная идея заключается в том, что клиент переходит на страницу и отправляет http-запрос на сервер, на котором находится страница. Затем сервер отображает страницу и возвращает ответ клиенту вместе с etag, который содержит некоторое значение. В дополнение к показу страницы, клиент будет хранить копию этой страницы в своем локальном кеше вместе с etag. В следующий раз, когда клиент заходит на эту страницу, он отправит запрос на веб-сервер, но включит etag в If-None-Match
заголовок. Такой запрос называется условным GET. Клиент говорит: "Я хотел бы эту страницу, однако у меня уже есть кэшированная версия страницы с этим значением etag, поэтому, если вы считаете, что моя кэшированная версия является текущей, просто скажите мне об этом, и я просто покажу свою кэшированная копия для пользователя ".
Нет никаких семантических требований для значения etag. Его следует использовать для хранения значения, позволяющего определить, актуальна ли копия клиента.
Самый простой способ сделать это - вычислить хеш вашего ответа, и если хеш совпадает со значением etag в заголовках запроса, тогда клиент уже содержит идентичную копию, и вы можете вернуть 304 No content
и вернуть пустое тело в ответе. Это намного быстрее, чем снова возвращать всю страницу.
оптимизация
Хотя вычисление хэша - это простой и безопасный способ определить, исправен ли кэш, существуют более интеллектуальные методы, которые позволят вам снизить нагрузку на ваш веб-сервер. Рассмотрим страницу, которая отображает товар в интернет-магазине. Вместо того, чтобы отображать страницу с описанием продукта, а затем вычислять и сравнивать хеш, вы можете просто использовать updated_at
приписывать. Это означает, что первое, что вы делаете в своем приложении, это проверяете etag и выбираете продукт из базы данных, чтобы сравнить updated_at
приписывать. Если это соответствует, вы предполагаете, что данные о товаре не были изменены, и вы можете закончить обработку запроса, ничего не делая дальше, а затем вернуть 304 No content
ответ.
Тем не менее, вы должны быть осторожны с этим типом оптимизации, так как на странице может быть дополнительный контент, который может устареть, не затрагивая updated_at
атрибут продукта в вашей базе данных. Это может быть боковая панель с последними новостями или, что еще хуже, персонализированная часть страницы, такая как корзина с перечнем ранее добавленных продуктов.
Chunked Encoding
Кодирование по частям - это всего лишь методика передачи ответа несколькими частями, поэтому принимающий клиент может начать рендеринг страницы быстрее, пока сервер все еще работает с оставшимися частями. Это не имеет никакого отношения к кешированию. Однако, если вы хотите использовать хэшированное значение ответа в качестве etag, это, очевидно, невозможно, поскольку заголовки отправляются до того, как вы узнаете полный ответ, необходимый для вычисления хэша.