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

时间:2012-10-23 13:48:37

标签: http gzip

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

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

我知道它可以反过来但是以任何方式使它以这种方式工作?

3 个答案:

答案 0 :(得分:69)

浏览器会自动为您的数据进行gzip编码吗?简短的回答是否定的。

答案很长,有些用户代理可以做这样的事情,但绝对不能依赖它。 apache mod_deflate docs状态:

  

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

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

请注意,您还需要添加相应的Content-Length:标头,指定压缩后的消息实体主体的字节大小 - 或 - 使用Transfer-Encoding: chunked发送HTTP消息并放弃内容长度规范

在接收端,您可以 instruct mod_deflate to use an input filter解压缩信息:

<Location /dav-area>
SetInputFilter DEFLATE
</Location>

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

答案 1 :(得分:7)

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

答案 2 :(得分:0)

使用https://github.com/dankogai/js-deflate实现此目的 然而,无论出于何种原因,postdata将剥离+符号并用空格替换它们。

通过javascript发送数据:

params.mapdata=  btoa(RawDeflate.deflate(JSON.stringify(mapdata)));

通过php接收数据:

$value = gzinflate(base64_decode(preg_replace('/\s/', '+',$value)));