我正在使用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
指令无关。检查下面的答案。
答案 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
。