压缩浏览器发送的HTTP Post数据

Der*_*gan 36 gzip http

我想用Javascript将压缩的POST数据发送到我控制的服务器.有没有办法让HTTP层处理压缩.

我正在发送JSON.如果我将内容类型设置为GZIP/deflate,浏览器会自动压缩它,然后Apache使用deflate mod自动解压缩它,这样我的应用程序就不必考虑被压缩的数据了吗?

我知道它可以相反的方式,但任何方式使它以这种方式工作?

rdl*_*rey 71

浏览器会自动为您的数据进行gzip编码吗?最简洁的答案是不.

长期的答案是,一些用户代理可以做这样的事情,但你绝对不能依赖它.apache mod_deflate docs状态:

一些特殊的应用程序实际上支持请求压缩,例如一些WebDAV客户端.

所以,不,那不行.您需要自己生成相应的HTTP请求消息.在这种情况下,适当的标题是,Content-Encoding: gzip而不是Content-Type:因为内容本身application/json,您只是想要编码HTTP请求消息的实体主体进行传输.

请注意,您还需要添加适当的Content-Length:标头,指定压缩后的消息实体主体的大小(以字节为单位) - 或者 - 使用Transfer-Encoding: chunked和放弃内容长度规范发送HTTP消息.

在接收端,您可以 指示mod_deflate使用输入过滤器来解压缩信息:

<Location /dav-area>
SetInputFilter DEFLATE
</Location>
Run Code Online (Sandbox Code Playgroud)

如果您只接收几个资源的压缩消息体,那么这有点沉重.相反,您应该只使用客户端脚本来检查Content-Encoding: gzip标头并手动解压缩请求主体.如何做到这一点,比如PHP,完全是另一个问题.如果您需要详细信息,请发布另一个问题.

  • 请注意"HAAHAHAAahahahahahhaha".是非常可压缩的. (131认同)
  • @MarkAdler不幸的是,PC警察已删除了部分答案。我想这还不够受欢迎。 (2认同)

Mic*_*ler 9

这是可能的,但我强烈建议不要接受传入服务器的gzip压缩数据.主要原因是防止您的服务器遭到gzip轰炸.在实际解压缩数据之前,通常无法知道未压缩数据的样子,因此用户可以向您发送看似无害的1 KB或1 MB数据的Web请求,但实际上是100 GB的数据,然后是您的网络服务器(nginx或apache)在接下来的10分钟内挂起,试图将其全部解压缩,最终耗尽内存/锁定.

  • @JaakL 压缩资源的“Content-Length”必须是压缩后的大小。请求中没有有关未压缩大小的信息。(换句话说,“Content-Length”是“以字节为单位的网络长度”) (7认同)
  • 但是如果你有“请注意,你还需要添加适当的Content-Length:标头指定压缩后消息实体主体的大小(以字节为单位)”,那么为什么你的服务器不能首先检查这个大小(主过滤器),然后指示解压缩器拒绝数据扩展超过预期大小(二级过滤器)? (2认同)
  • 服务器应该有最大未压缩长度检查。如果在解压缩过程中,解压缩的流超过了该长度,服务器将立即断开连接并释放所有资源。 (2认同)