关于是否要做事,目前的状况是什么
Transfer-Encoding: gzip
或一个
Content-Encoding: gzip
当我要允许带宽有限的客户表示他们愿意接受压缩响应并且服务器最终决定是否压缩时。
后者就是例如Apache的mod_deflate和IIS所做的,如果让它负责压缩的话。根据要压缩的内容的大小,它将执行额外的操作Transfer-Encoding: chunked
。
它还将包含一个Vary: Accept-Encoding
,已经暗示了该问题。Content-Encoding
似乎是实体的一部分,因此将Content-Encoding
金额更改为实体的变化,即,不同的Accept-Encoding
标头意味着例如缓存无法使用其在其他方面相同的实体的缓存版本。
我是否错过了一个明确的答案(并且没有在某些Apache新闻组的长线程中隐藏在消息中)?
我目前的印象是:
- 实际上,传输编码将是正确完成现有服务器和客户端功能的内容编码的正确方法
- 由于内容编码的语义含义,它带来了两个问题(服务器
ETag
透明压缩响应时,服务器应该如何处理?) - 原因是“鸡蛋”:浏览器不支持它,因为服务器不支持,因为浏览器不支持
因此,我假设正确的方法是Transfer-Encoding: gzip
(或者,如果我另外对主体进行分块,它将变成 Transfer-Encoding: gzip, chunked
)。在这种情况下,没有理由触摸Vary
或ETag
任何其他标头,因为这是传输级的事情。
目前,我不太在乎的“逐跳”性质Transfer-Encoding
,这是其他人首先关注的问题,因为代理可能会解压缩并转发给客户端。但是,如果原始请求具有正确的Accept-Encoding
标头,则代理可能会按原样转发(压缩)它,对于我所知道的所有浏览器来说,都是给定的。
顺便说一句,这个问题至少存在十年了,请参阅例如 https://bugzilla.mozilla.org/show_bug.cgi?id=68517。
任何对此的澄清将不胜感激。无论是从符合标准的方面还是从实用性方面而言。例如,仅支持透明“ Content-Encoding”的HTTP客户端库可能会反对实用性。
Transfer-Encoding:gzip
,尽管命令行curl可以。为了安全起见,请同时发送两者,除非您要结合使用chunk和gzip。