为什么在使用POST方法时对请求体进行GZIP压缩不常见?

19

最近我在尝试使用GZIP压缩技术,以下是我的理解:

  1. 客户端请求网页服务的某些文件或数据,并发送一个头部信息"Accept-Encoding,gzip"
  2. 网页服务获取所需的文件或数据,对它们进行压缩,然后将 GZIP 压缩后的数据返回给客户端。网页服务也会发送一个标头信息"Content-Encoded,gzip",以通知客户端数据已被压缩。
  3. 客户端接收到数据/文件后,对其进行解压并展示给用户。

我了解到这是一种常见做法,当需要加载大量 HTML、CSS 和 JavaScript 等文件时,这种方法可以使页面加载时间更短。

然而,我希望进一步了解为什么在进行 POST 请求时不常用 GZIP 压缩请求体?这是因为通常请求体比较小,所以在网页服务器上解压文件所需的时间比发送请求还要长吗?是否有相关文件或参考资料可供查询?

谢谢!

3个回答

6
在客户端-服务器关系中,服务器将所有数据发送到客户端,因此,像你提到的那样,来自客户端的数据往往很小,因此压缩很少带来性能上的提升,这使得这种情况不常见。
在REST API中,我认为大请求负载很常见,但显然,以其REST工具而闻名的Spring Framework不同意这一点 - 他们明确表示在这里,你可以设置servlet容器来进行响应压缩,没有提到请求压缩。由于Spring Framework的操作方式是提供他们认为很多人会使用的功能,他们显然认为没有必要为我们用户提供一个ServletFilter实现,以便我们可以使用它来读取已压缩的请求体。
如果你想编写自己的解压缩过滤器,请尝试阅读此文:如何解码Spring MVC中的gzip压缩请求正文

或者,将您的Servlet容器放在提供更多功能的Web服务器后面。 人们显然需要请求压缩,以至于像Apache这样的Web服务器提供它 - 这个SO答案已经很好地总结了它:HTTP请求压缩-您会在那里找到对HTTP规范的参考。


5

这是一个非常老的问题,但我决定重新激活它,因为这是我的第一个谷歌搜索结果,并且我感觉当前的唯一答案不完整。

HTTP 请求压缩不常见,因为客户端不能确定服务器是否支持它。

当服务器发送响应时,它可以使用来自客户端请求的Accept-Encoding头部信息,以查看客户端是否能够理解已经被gzipped压缩的响应。

当客户端发送请求时,它可能是第一个HTTP通讯,因此没有什么可以告诉客户端服务器能够理解已经被gzipped压缩的请求。客户端仍然可以这样做,但这是一种赌博。

尽管很少有现代http服务器不知道gzip,但将其应用于请求正文的配置仍然非常不常见。至少在nginx上,似乎需要使用自定义的Lua脚本才能使其工作。


-1

不要这样做,原因无他,只是为了安全。防火墙很难或者根本无法处理压缩的输入数据。


4
防火墙会难以解密TLS/SSL,所以我不确定你的观点是什么。 - Matthew Whited
防火墙经常进行解密,这被称为深度数据包检查,这就是为什么您需要在防火墙上安装证书的原因。关键是,他们需要解压缩压缩的数据以应用其规则,但他们不会这样做(也不应该这样做,因为有很多原因)。来自常见防火墙的简单示例 https://docs.fortinet.com/document/fortigate/6.2.12/cookbook/122078/deep-inspection - Tony B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接