Каково текущее положение дел, когда дело доходит до того, нужно ли делать
Transfer-Encoding: gzip
или
Content-Encoding: gzip
когда я хочу разрешить клиентам, например, с ограниченной пропускной способностью, сигнализировать о своей готовности принять сжатый ответ, и последнее слово остается за сервером, сжимать или нет .
Последнее - то, что делают, например, Apache mod_deflate и IIS, если вы позволите ему позаботиться о сжатии. В зависимости от размера сжимаемого содержимого он будет выполнять дополнительные функции Transfer-Encoding: chunked
.
Он также будет включать в себя Vary: Accept-Encoding
, который уже намекает на проблему. Content-Encoding
кажется, является частью объекта, поэтому изменение Content-Encoding
сумм означает изменение объекта, то есть другой Accept-Encoding
заголовок означает, например, что кеш не может использовать свою кэшированную версию идентичного объекта.
Есть ли определенный ответ на этот вопрос, который я пропустил (и который не похоронен внутри сообщения в длинной цепочке какой-нибудь группы новостей apache)?
Мое текущее впечатление:
- Transfer-Encoding на самом деле будет правильным способом сделать то, что в основном делается с Content-Encoding существующими серверными и клиентскими реализациями.
- Content-Encoding из-за своего семантического значения несет в себе несколько проблем (что должен делать сервер,
ETag
когда он прозрачно сжимает ответ?) - Причина в том, что это курица и яйцо: браузеры не поддерживают ее, потому что серверы не поддерживают ее, потому что браузеры не поддерживают ее.
Итак, я предполагаю, что правильным способом будет Transfer-Encoding: gzip
(или, если я дополнительно разделю тело, оно станет Transfer-Encoding: gzip, chunked
). И нет причин трогать Vary
или ETag
или любой другой заголовок в этом случае, поскольку это вещь транспортного уровня.
На данный момент меня не слишком заботит "переход за шагом" Transfer-Encoding
, то, что, кажется, беспокоит других в первую очередь, потому что прокси-серверы могут распаковывать и пересылать несжатые данные клиенту. Однако прокси-серверы могут пересылать его как есть (сжатый), если исходный запрос имеет правильный Accept-Encoding
заголовок, что для всех известных мне браузеров является заданным.
Кстати, этой проблеме как минимум десять лет, см., Например, https://bugzilla.mozilla.org/show_bug.cgi?id=68517 .
Мы будем благодарны за любые разъяснения по этому поводу. И с точки зрения того, что считается соответствующим стандартам, и с точки зрения практичности. Например, клиентские библиотеки HTTP, поддерживающие только прозрачное «Content-Encoding», будут аргументом против практичности.
источник
Transfer-Encoding:gzip
, хотя curl из командной строки понимает . На всякий случай отправьте оба, если вы не объединяете chunked и gzip.Ответы:
Цитата Роя Т. Филдинга , одного из авторов RFC 2616:
Источник: https://issues.apache.org/bugzilla/show_bug.cgi?id=39727#c31
Другими словами: не выполняйте кодирование содержимого на лету , используйте вместо этого Transfer-Encoding!
Изменить: то есть, если вы не хотите предоставлять сжатый контент клиентам, которые понимают только Content-Encoding . К сожалению, их большинство. Но имейте в виду, что вы покидаете области спецификации и можете столкнуться с проблемами, такими как упомянутая Филдингом, а также другими, например, когда задействованы кэширующие прокси.
источник
TE: gzip
. И тогда ваш сервер должен пойти по маршруту Transfer-Encoding. Если клиент только говоритAccept-Encoding: gzip
, вы должны делать это как надоContent-Encoding
. Если клиент не указывает ни то, ни другое в своем запросе, сервер вообще не должен использовать gzip.Правильное использование, как это определено в RFC 2616 и фактически реализованы в дикой природе, для клиента , чтобы послать
Accept-Encoding
заголовок запроса (клиент может указать несколько кодировок). Затем сервер может и только тогда закодировать ответ в соответствии с кодировками, поддерживаемыми клиентом (если данные файла еще не сохранены в этой кодировке), указать вContent-Encoding
заголовке ответа, какая кодировка используется. Затем клиент может считывать данные из сокета на основеTransfer-Encoding
(т. Е.chunked
), А затем декодировать их на основеContent-Encoding
(т. Е.gzip
).Итак, в вашем случае клиент отправит
Accept-Encoding: gzip
заголовок запроса, а затем сервер может решить сжать (если еще не) и отправитьContent-Encoding: gzip
и, возможно,Transfer-Encoding: chunked
заголовок ответа.И да,
Transfer-Encoding
заголовок можно использовать в запросах, но только для HTTP 1.1, который требует, чтобы реализации как клиента, так и сервера поддерживалиchunked
кодирование в обоих направлениях.ETag
однозначно идентифицирует данные ресурса на сервере, а не фактически передаваемые данные. Если данный ресурс URL меняет своеETag
значение, это означает, что данные на стороне сервера для этого ресурса изменились.источник
Content-Encoding
требуется другое.ETag
Это, кстати, и есть ошибка mod_deflate, о которой я упоминаю в своем ответе. Это заставляет меня задаться вопросом, почему эта детализация уровня приложения вообще находится в стандарте HTTP. Однако при использованииTransfer-Encoding
настройки транспортного уровня нет необходимости изменятьETag
. Кроме того, что никто не внедрил Transfer-Enc.Content-Encoding
противTransfer-Encoding
. Да, gzip должен быть свойством передачи ресурса, если это делается "на лету". С другой стороны, если ресурс хранится на сервере в сжатом виде, он должен быть свойством содержимого ресурса, если отправляется как есть. Но то, что должно быть, и то, что есть на самом деле , не всегда одно и то же.