在是否要做的问题上,目前的情况是什么
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 完成大部分工作的正确方法
ETag
内容编码,因为它的语义含义,带来了几个问题(当它透明地压缩响应时,服务器应该做什么?)- 原因很简单:浏览器不支持它,因为服务器不支持,因为浏览器不支持
所以我假设正确的方法是 a Transfer-Encoding: gzip
(或者,如果我另外分块身体,它会变成 Transfer-Encoding: gzip, chunked
)。在这种情况下,没有理由触摸Vary
或ETag
任何其他标题,因为它是传输级别的东西。
现在我不太关心 的“逐跳”性Transfer-Encoding
,其他人似乎首先关心的是,因为代理可能会解压缩并将未压缩的转发给客户端。但是,如果原始请求具有正确的标头,代理也可以按原样(压缩)转发它,Accept-Encoding
在我知道的所有浏览器的情况下都是给定的。
顺便说一句,这个问题至少有十年的历史了,参见例如 https://bugzilla.mozilla.org/show_bug.cgi?id=68517。
对此的任何澄清将不胜感激。无论是在什么被认为符合标准和什么被认为是实用方面。例如,仅支持透明“内容编码”的 HTTP 客户端库将成为反对实用性的论据。