Transfer-Encoding:chunked发送两次(响应体中包含的块大小)

时间:2016-09-09 16:11:12

标签: php apache http

我正在使用Apache 2.2和PHP 7.0.1。我强制使用flush()的分块编码,如下例所示:

<?php

header('HTTP/1.1 200 OK');
echo "hello";
flush();
echo "world";

die;

我在回复的开头和结尾都收到了不需要的字符:

HTTP/1.1 200 OK                       
Date: Fri, 09 Sep 2016 15:58:20 GMT   
Server: Apache/2.2.15 (CentOS)        
X-Powered-By: PHP/7.0.9               
Connection: close                     
Transfer-Encoding: chunked            
Content-Type: text/html; charset=UTF-8

a                                     
helloworld                            
0                                     

第一个是十六进制的块大小(10 = A)。我正在使用Klein作为PHP路由器,我发现只有在重写HTTP状态标头时才会出现问题。我想我的Apache配置存在问题,但我无法弄明白。

编辑:我的问题与Apache无关,但与Nginx和chunked_transfer_encoding指令无关。检查下面的答案。

2 个答案:

答案 0 :(得分:3)

这就是Transfer-Encoding: chunked works的方式。您看到的额外字符是编码的一部分,而不是正文。

了解编码的客户端不会在结果中包含它们;一个不支持HTTP / 1.1的客户端,应该被认为是错误的。

答案 1 :(得分:0)

正如@Joe之前指出的那样,这是启用 Chunked transfer enconding 时的正常行为。我的测试不准确,因为我直接在服务器上请求 Apache 。实际上,当我在Chrome中遇到问题时,我正在查询 Nginx 服务作为Apache的代理。

通过运行tcpdump我意识到Nginx是重新应对响应,但只有在PHP中重写HTTP状态标头(header('HTTP/1.1 200 OK'))时才会这样做。发送Transfer-Encoding: chunked两次的解决方案是在我的Nginx .php处理程序chunked_transfer_encoding off上下文中设置location