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


35

我看到了许多有关为服务器响应启用http压缩的信息,但对于传入请求则有很多信息。浏览器在将大尺寸帖子发送到服务器之前压缩它们是否有意义?

另一个示例是我们使用的REST Web服务。我们必须频繁发送带有大型XML文件(超过10 MB)的PUT请求,并且肯定会在双方的带宽/速度方面带来好处。

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

Answers:


30

要将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

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


5
+1 NB你写you must compress the whole request, inclusive of header。但是,不得压缩http标头。http正文是唯一需要压缩的内容(如您正确引用的文章所述,完整内容)。
尤金·别列索夫斯基

1
这是错误的:Accept-Encoding告诉服务器客户端支持什么压缩。标头Content-Encoding描述了身体的压缩。
maaartinus 2014年

@maaartinus参见第一引号第二段。为了清楚起见,我重新整理了答案。
安迪2014年

4

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

  1. 该应用程序本身支持对请求主体进行充气。可以做到这一点的示例库是phpxmlrpc。

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


2

并非来自我所知道的任何浏览器,您都必须找到一个可以为您做的插件。基本上,您必须设置内容编码HTTP标头,以使服务器知道请求的传入方式。服务器当然需要能够处理该编码。


0

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


12
这个答案是错误的RFC 2616特别提到,它If the content-coding of an entity in a request message is not acceptable to the origin server, the server SHOULD respond with a status code of 415 (Unsupported Media Type).Request and Response messages MAY transfer an entity if not otherwise restricted by the request methodContent-Encodingentity-header
PeterT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.