如何禁用传输编码:使用 HTTP/1.1 响应在 Apache 中分块

PP.*_*PP. 6 encoding chunked apache-2.2

我有一个 mod_include (SSI) 页面,它在 HTTP/1.1 浏览器请求时在分块编码期间生成错误输出。

当 HTTP/1.0 请求页面时,页面输出正常(因为输出没有分块)。

如何在 HTTP/1.1 浏览器请求时告诉 Apache不要使用分块编码?

更多信息:错误的分块输出是由于在带有 sparc 处理器的 Solaris 5.10 机器上启用了 sendfile() 支持造成的。禁用 sendfile() 支持会导致这个问题消失;但是我试图抓住这个错误并修复它。

小智 11

上面的答案是错误的。

如果请求是 HTTP/1.0,Apache 永远不会在发送之前缓冲响应(带有 Content-Length 标头)。当然 Apache 可以做到这一点,但是 Apache 使用了更优雅的解决方案:它以“Connection: close”标头响应,并在发送所有数据后立即关闭连接。

根据HTTP 规范,“Connection: close”标头的存在意味着客户端需要读取直到连接关闭。

您的问题的解决方案是通过设置提到的downgrade-1.0环境变量来强制 Apache 将请求视为 HTTP/1.0 。分块传输编码是 HTTP/1.1 特性,Apache 不会将其用于 HTTP/1.0 请求。

例如,这里是如何禁用 php 文件的分块响应:

++++++++++++
apache.conf
++++++++++++

<Files *.php>
    SetEnv downgrade-1.0
</Files>
Run Code Online (Sandbox Code Playgroud)

  • 这会导致网络服务器响应 HTTP/1.0 响应还是 HTTP/1.1 响应但没有 HTTP/1.1 功能? (2认同)

BMD*_*Dan 10

如果您预先指定 Content-length,Apache 将不必使用分块。如果没有 Content-length,Apache 就别无选择,只能使用它。

需要明确的是:HTTP/1.0 管理它,因为 Apache 在发送之前读取整个响应,所以它知道它有多大。这是非常低效和缓慢的,AFAIK 没有办法为 HTTP/1.1 请求启用这个逻辑,除非强制它们使用 HTTP/1.0(你真的,真的不想这样做,是吗?如果你这样做, 要设置的环境变量是"downgrade-1.0" )