是否可以对请求启用 http 压缩?

是否可以对请求启用 http 压缩?

我看到很多关于为服务器响应启用 http 压缩的信息,但对于传入请求呢?浏览器在将大型表单帖子发送到服务器之前对其进行压缩难道不合理吗?

另一个例子是我们使用的 REST Web 服务。我们必须频繁发送带有大型 XML 文件 (10+ MB) 的 PUT 请求,并且肯定会看到双方的带宽/速度优势。

那么,这是服务器端已解决的问题还是每个 Web 应用程序都必须单独处理它?

答案1

要将PUT数据压缩后发送到服务器,您必须压缩请求正文并设置标Content-Encoding: gzip头。标头本身必须是未压缩的。它记录在mod_deflate

mod_deflate 模块还提供了用于解压 gzip 压缩请求主体的过滤器。为了激活此功能,您必须使用 SetInputFilter 或 AddInputFilter 将 DEFLATE 过滤器插入到输入过滤器链中。

...

现在,如果请求包含 Content-Encoding: gzip 标头,则请求主体将自动解压缩。很少有浏览器能够对请求主体进行 gzip 压缩。但是,一些特殊应用程序实际上支持请求压缩,例如一些 WebDAV 客户端。

有一篇描述它的文章是这里

那么该怎么做呢?下面是来自 mod_deflate 源代码的一段简介:只对主请求有效/不处理子请求。这意味着如果我们选择使用 gzip 压缩,则必须对整个请求主体进行压缩,例如在多部分请求中,不可能只压缩包含文件的部分。

Accept-Encoding另外,浏览器可以通过设置标头来请求服务器响应内容进行压缩这里

GET /index.html HTTP/1.1
Host: www.http-compression.com
Accept-Encoding: gzip
User-Agent: Firefox/1.0

这会将压缩数据返回给浏览器。

答案2

回答关于压缩请求而不是响应的部分:是的,这是可能的,即使它似乎没有被广泛使用。客户端应用程序需要设置适当的内容编码标头。至于服务器端应用程序,有两种选择:

  1. 应用程序支持自行重新填充请求主体。可以执行此操作的一个示例库是 phpxmlrpc。

  2. 网络服务器在将响应主体传递给应用程序之前对其进行扩充。这可以通过使用 Apache 的 mod_deflate 过滤器并设置 inputFilter 来实现

答案3

据我所知,任何浏览器都无法原生支持该编码,您必须找到一个插件来帮您实现。您基本上必须设置内容编码 HTTP 标头,让服务器知道请求是如何传入的。当然,服务器需要能够处理该编码。

答案4

这是不允许的。根据 HTTP 规范 (RFC 2616)Content-Encoding不是可能的请求标头字段之一,因此无法压缩请求实体主体,因为没有合法的方式让服务器知道已发生这种情况。请求主体的任何压缩都仅作为非标准扩展完成。

相关内容