【问题标题】:Transfer-Encoding: chunked sent twice (chunk size included in response body)传输编码:分块发送两次(响应正文中包含块大小)
【发布时间】:2016-09-09 16:11:12
【问题描述】:

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

【问题讨论】:

  • 您看到的不需要的字符到底是什么?
  • @JasonHoetger “a”(十六进制为 10,因为有 10 个字符)和尾随的“0”。它们包含在正文中,因此它破坏了我的 HTML。

标签: php apache http


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      • 2013-05-03
      • 2013-05-08
      • 2018-07-12
      • 2021-07-18
      • 2023-03-16
      • 1970-01-01
      相关资源
      最近更新 更多