传输编码:gzip与内容编码:gzip(Transfer-Encoding: gzip vs. Co

2019-06-26 12:55发布

当谈到是否做的是事务的当前状态

Transfer-Encoding: gzip

Content-Encoding: gzip

当我想允许与例如带宽有限的客户 表示它们愿意接受压缩响应服务器说了算是否要压缩

后者正是如Apache的mod_deflate模块和IIS做,如果你让它采取压缩的照顾。 根据内容的大小被压缩,它会做额外的Transfer-Encoding: chunked

它还将包括一个Vary: Accept-Encoding ,这已经暗示了这个问题。 Content-Encoding似乎是实体的一部分,因此更改Content-Encoding量的实体的变化,即不同的Accept-Encoding头指如高速缓存不能使用,否则相同的实体的缓存版本。

有没有办法,我错过了(这不是在某些阿帕奇新闻组很长的线埋藏的消息中)在此一个明确的答案?

我现在的感觉是:

  • 传输编码实际上将做正确的方法是什么大多与内容编码由现有的服务器和客户端implentations完成
  • 内容编码,因为它的语义含义,怀揣着几个问题(我应该在服务器尽到ETag时,透明压缩的响应?)
  • 原因是chicken'n'egg:浏览器不支持,因为服务器不因为浏览器不

所以我假设正确的方式将是一个Transfer-Encoding: gzip (或者,如果我还块体,它会成为 Transfer-Encoding: gzip, chunked )。 并没有理由触及VaryETag或在这种情况下,任何其他的头,因为它是一个传输层的事情。

现在我没有太在意的“逐hop'岬Transfer-Encoding ,一些人似乎担心首先,因为代理可以解压缩和非压缩向前到客户端。 然而,代理还不如将其转发为-IS(压缩),如果原来的请求具有正确的Accept-Encoding头,这是我所知道的是所有浏览器的情况下,给定的。

顺便说一句,这个问题至少十年的老,看到如https://bugzilla.mozilla.org/show_bug.cgi?id=68517 。

任何对此的澄清将不胜感激。 无论是在什么被认为是符合标准的术语,什么是符合实际情况。 例如,仅支持透明的“内容编码” HTTP客户端库将针对实用性的理由。

Answer 1:

报价罗伊T.菲尔丁 ,RFC 2616的作者之一:

在飞行中改变内容的编码不一致的方式(不是“从来没有”,也不是“总是)使得它不可能针对这些内容以后的请求(例如,PUT或有条件GET)要正确处理。这是当然的,为什么执行对即时内容的编码是一个愚蠢的想法,为什么我添加传输编码为HTTP作为正确的方法做即时编码不改变资源。

来源: https://issues.apache.org/bugzilla/show_bug.cgi?id=39727#c31

换句话说:不要对即时内容编码,使用传输编码,而不是!

编辑:也就是说, 除非你想成为gzip压缩的内容给客户,只有了解内容编码 。 其中,不幸的是,似乎是其中的大多数。 但要知道,你离开了规范的领域和可能遇到的问题,如通过在缓存代理参与菲尔丁以及其他,如提到的。



Answer 2:

正确用法,如在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值,则意味着该资源的服务器端的数据发生了变化。



文章来源: Transfer-Encoding: gzip vs. Content-Encoding: gzip