防止 Apache 对 gzip 内容进行分块

Posted

技术标签:

【中文标题】防止 Apache 对 gzip 内容进行分块【英文标题】:Prevent Apache from chunking gzipped content 【发布时间】:2010-12-27 13:11:02 【问题描述】:

在 Apache2 中使用 mod_deflate 时,Apache 会将 gzip 压缩的内容分块,设置 Transfer-encoding: chunked 标头。虽然这会缩短下载时间,但我无法显示进度条。

如果我自己在 php 中处理压缩,我可以先将其完全 gzip 并设置 Content-length 标头,以便向用户显示进度条。

是否有任何设置会改变 Apache 的默认行为,并让 Apache 设置 Content-length 标头而不是分块响应,这样我就不必自己处理压缩?

【问题讨论】:

【参考方案1】:

您也许可以使用sendBufferSize 来获得一个足够大的值来将您的响应包含在一个块中。

那么chunked content 是 HTTP/1.1 协议的一部分,你可以强制一个 HTTP/1.0 响应(所以不要分块:“服务器不得向 HTTP/1.0 客户端发送传输编码。”)通过在您的 apache 配置中设置 force-response-1.0。但是 PHP 打破了这个设置,这是 PHP 的一个长期已知的错误,有一个 workaround。

我们可以尝试使用防止分块内容的标头修改客户端的请求,但是 w3c 说:“所有 HTTP/1.1 应用程序必须能够接收和解码“分块”传输编码”,所以我认为没有像“Accept”这样的标题可以防止服务器分块内容。但是,您可以尝试在 HTTP/1.0 中设置您的请求,它并不是真正的请求标头,它是第一行,当然应该可以使用 jQuery。

最后一件事,HTTP/1.0 缺少一件大事,'host' 标头不是强制性的,如果您使用基于名称的虚拟主机,请验证您在 HTTP/1.0 中的请求是否仍在使用 'host' 标头。

编辑: 通过使用解决方法中引用的技术,您可以看到可以在 PHP 代码中调整 Apache env。这可用于仅对您的特殊 gzip 内容强制使用 1.0 模式,并且您应该使用它来防止您在 HTTP/1.0 中完成应用程序(或使用请求模式为您的 gzip 请求设置 HTTP/1.0)。

【讨论】:

谢谢,但所有这些听起来都比我自己在 PHP 中处理压缩要复杂。 您是否尝试在分块响应上强制设置 content-lenght 标头?关于复杂性,我不认为使用简单的“ apache_setenv('force-response-1.0','true');”在你的 PHP 脚本上渲染你的内容被压缩很难,但这取决于你:-) Content-length 和 chunked Transfer-encoding 不能一起使用。关于复杂性,我的意思是在这种情况下我还不如在 PHP 中处理压缩。

以上是关于防止 Apache 对 gzip 内容进行分块的主要内容,如果未能解决你的问题,请参考以下文章

使用apache-commons-lang3框架,对html内容进行编码和反编码

[JavaWeb]_[初级]_[对Html特殊符号进行转义防止XSS攻击和反转义]

[JavaWeb]_[初级]_[对Html特殊符号进行转义防止XSS攻击和反转义]

WEB服务之apache优化

Apache优化之apache网页压缩

iOS 网络数据安全(防止抓包)