我有一个mod_include(SSI)页面,在HTTP / 1.1浏览器请求时,在分块编码过程中会生成错误的输出。
HTTP / 1.0请求时,页面输出正常(因为输出没有分块)。
我如何告诉Apache 不要在HTTP / 1.1浏览器请求时使用分块编码?
更多信息:错误的分块输出是由具有sparc处理器的Solaris 5.10机器启用了sendfile()支持引起的。 禁用sendfile()支持导致此问题消失; 不过,我正试图抓住这个错误并修复它。
如果预先指定Content-length,则Apache不必使用分块。 没有内容长度,Apache没有select,只能使用它。
要清楚:HTTP / 1.0pipe理它,因为Apache在发送之前读取整个响应,所以它知道它会有多大。 这是非常低效的,而且速度很慢,AFAIK没有办法为HTTP / 1.1请求启用这个逻辑,除非强制它们使用HTTP / 1.0(你真的不想这么做吗? ,要设置的环境variables是“降级-1.0” )
上面的答案是不正确的。
如果请求是HTTP / 1.0,那么Apache在发送消息(使用Content-Length头)之前从不caching响应。 当然,Apache可以做到这一点,但是Apache使用了更优雅的解决scheme:它使用“Connection:close”标题进行响应,并在发送所有数据后立即closures连接。
根据HTTP规范 ,“连接:closures”头的存在意味着客户端需要阅读直到连接closures。
解决您的问题的方法是强制Apache将请求设置为HTTP / 1.0,方法是设置提及的降级-1.0环境variables。 分块的Transfer-Encoding是一个HTTP / 1.1特性,Apache不会将它用于HTTP / 1.0请求。
例如,这里是如何可以禁用PHP文件分块响应:
++++++++++++ apache.conf ++++++++++++ <Files *.php> SetEnv downgrade-1.0 </Files>