Php 传输编码:分块发送两次(分块大小包含在响应正文中)

Php 传输编码:分块发送两次(分块大小包含在响应正文中),php,apache,http,Php,Apache,Http,我正在使用Apache2.2和PHP7.0.1。我使用flush()强制分块编码,如本例所示: <?php header('HTTP/1.1 200 OK'); echo "hello"; flush(); echo "world"; die; 第一个是以十六进制表示的块大小(10=A)。我正在使用as PHP路由器,我发现只有在重写HTTP状态头时才会出现问题。我想我的Apache配置有问题,但我没能弄明白 Edited:我的问题与Apache无关,与Nginx和chunked\u

我正在使用Apache2.2和PHP7.0.1。我使用
flush()
强制分块编码,如本例所示:

<?php

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

die;
第一个是以十六进制表示的块大小(10=A)。我正在使用as PHP路由器,我发现只有在重写HTTP状态头时才会出现问题。我想我的Apache配置有问题,但我没能弄明白

Edited:我的问题与Apache无关,与Nginx和
chunked\u transfer\u编码
指令无关。检查下面的答案。

就是这样。您看到的额外字符是编码的一部分,而不是正文

理解编码的客户端不会将其包含在结果中;一个不支持HTTP/1.1的客户机,应该被认为有漏洞。

这就是问题所在。您看到的额外字符是编码的一部分,而不是正文


理解编码的客户端不会将其包含在结果中;一个不支持HTTP/1.1的客户端,应该被认为是有漏洞的。

正如@Joe之前指出的,这是启用分块传输加密时的正常行为。我的测试不准确,因为我直接在服务器上请求Apache。实际上,当我在Chrome中遇到问题时,我正在查询一个Nginx服务作为Apache的代理


通过运行
tcpdump
,我意识到Nginx正在记录响应,但仅当在PHP中重写HTTP状态头(
头(
)时。发送
Transfer Encoding:chunked
两次的解决方案是在我的Nginx
位置
上下文中设置
chunked\u Transfer\u Encoding
,php处理程序

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


通过运行
tcpdump
,我意识到Nginx正在记录响应,但仅当在PHP中重写HTTP状态头(
头(
)时。发送
Transfer Encoding:chunked
两次的解决方案是在我的Nginx
位置
上下文中设置
chunked\u Transfer\u Encoding
。php处理程序

您看到的不需要的字符到底是什么?@JasonHoetger输入“a”(10个十六进制字符)和尾随的“0”。它们包含在正文中,因此它破坏了我的HTML。您看到的不需要的字符是什么?@JasonHoetger“a”(10个十六进制字符,因为有10个字符)和尾随的“0”。它们包含在正文中,所以它破坏了我的HTML。
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