Как кэши HTTP-прокси решают между обслуживанием идентификационных данных иресурсы в формате gzip?
-
22-08-2019 - |
Вопрос
HTTP-сервер использует согласование содержимого для обслуживания одного URL-адреса, закодированного в формате gzip или на основе данных клиента. Accept-Encoding
заголовок.
Теперь предположим, что у нас есть прокси-кеш, такой как squid, между клиентами и httpd.
Если прокси-сервер кэширует обе кодировки URL-адреса, как он определяет, какую из них обслуживать?
Экземпляр без gzip (изначально не обслуживаемый с Vary
) может быть отправлен любому клиенту, но закодированные экземпляры (имеющие Vary: Accept-Encoding
) могут быть отправлены только клиентам с идентичным Accept-Encoding
значение заголовка, которое использовалось в исходном запросе.
Например.Опера отправляет "deflate, gzip, x-gzip, identity, *;q=0"
но IE8 отправляет "gzip, deflate"
.Согласно спецификации, кэши не должны совместно использовать кэши с закодированным контентом между двумя браузерами.Это правда?
Решение
Во-первых, ИМХО неправильно не отправлять "Vary:Accept-Encoding», когда сущность действительно меняется в зависимости от этого заголовка (или его отсутствия).
При этом спецификация в настоящее время действительно запрещает отправку кэшированного ответа Opera, поскольку заголовок Vary не соответствует определениям в HTTPbis, часть 6, раздел 2.6.Возможно, в этой области нам следует ослабить требования к кэшам (возможно, вы захотите следить за Список рассылки HTTP IETF...
ОБНОВЛЯТЬ:оказывается, это уже было отмечено как открытый вопрос;Я только что добавил проблему в наш трекер проблем, см. Выпуск 147.
Другие советы
Джулиан прав, конечно.Урок: Всегда отправлять Vary: Accept-Encoding
когда нюхаю Accept-Encoding
, независимо от кодировки ответа.
Чтобы ответить на мой вопрос, если вы по ошибке уйдете Vary
out, если прокси получает незакодированный ответ (без Vary
), он может просто кэшировать и возвращать это для каждого последующего запроса (игнорируя Accept-Encoding
). Кальмар делает это.
Большая проблема с исключением Vary заключается в том, что если кеш получает закодированный вариант без Vary, он МОЖЕТ отправить его в ответ на другие запросы, даже если их Accept-Encoding указывает, что клиент не может понять содержимое.