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)
BMD*_*Dan 10
如果您预先指定 Content-length,Apache 将不必使用分块。如果没有 Content-length,Apache 就别无选择,只能使用它。
需要明确的是:HTTP/1.0 管理它,因为 Apache 在发送之前读取整个响应,所以它知道它有多大。这是非常低效和缓慢的,AFAIK 没有办法为 HTTP/1.1 请求启用这个逻辑,除非强制它们使用 HTTP/1.0(你真的,真的不想这样做,是吗?如果你这样做, 要设置的环境变量是"downgrade-1.0" )