Chrome net :: ERR_INCOMPLETE_CHUNKED_ENCODING错误

时间:2015-04-27 11:12:53

标签: php apache google-chrome chunked-encoding chunked

过去两个月,我在Chrome的开发者控制台上收到以下错误:

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:close
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Mon, 27 Apr 2015 10:52:52 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Pragma:no-cache
Server:Apache/2.2.22 (Ubuntu)
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Powered-By:PHP/5.3.10-1ubuntu3.8

症状:

  • 页面未加载。
  • 截断CSS和JS文件。
  • 页面悬挂。

服务器环境:

  • Apache 2.2.22
  • PHP
  • Ubuntu的

我在内部的Apache服务器上发生了这种情况。其他人不会发生这种情况 - 即我们的用户都没有遇到此问题 - 我们的开发团队也没有其他人。

其他人使用相同版本的Chrome访问完全相同的服务器。我还尝试禁用所有扩展程序并在隐身模式下浏览 - 无效。

我使用过Firefox并且发生了同样的事情。截断的文件和诸如此类的东西。唯一的问题是,Firefox不会引发任何控制台错误,因此您需要通过Firebug检查HTTP请求以查看问题。

Apache的响应标头:

SetEnv downgrade-1.0

在测试时,我能够通过在我的htaccess文件中强制HTTP 1.0来修复此问题:

hash.reverse_each.with_index do |(_, value), index|
  break value if (index == 0)
end

这解决了这个问题。但是,通过HTTP 1.1强制HTTP 1.0不是一个合适的解决方案。

更新:因为我是唯一一个遇到此问题的人,我认为我需要花更多的时间来调查它是否是客户端问题。如果我进入Chrome的设置并使用"还原为默认值"选项, 问题将消失 约10-20分钟。然后它返回。

37 个答案:

答案 0 :(得分:35)

该错误试图说明Chrome页面在发送时被切断了。你的问题是试图找出原因。

显然,这可能是影响几个版本Chrome的已知问题。据我所知,这些版本的问题是对发送的块的内容长度和该块的表达大小非常敏感(我可能远远不是那个)。简而言之,一个稍微不完美的标题问题。

另一方面,可能是服务器没有发送终端0长度的块。哪个可以通过ob_flush();进行修复。 Chrome(或连接或其他东西)也可能很慢。因此,当连接关闭时,页面尚未加载。我不知道为什么会这样。

这是偏执的程序员回答:

<?php
    // ... your code
    flush();
    ob_flush();
    sleep(2);
    exit(0);
?>

在您的情况下,可能是脚本超时的情况。我不确定为什么它只影响你,但它可能会归结为一堆竞争条件?这完全是猜测。您应该能够通过延长脚本执行时间来测试它。

<?php
    // ... your while code
    set_time_limit(30);
    // ... more while code
?>

它也可能就像您需要更新Chrome安装一样简单(因为此问题是特定于Chrome的)。

更新:当PHP(在同一本地主机上)为output buffering时抛出致命错误,我能够复制此错误(最后)。我想输出的结果太糟糕了以至于没什么用处(标题很少或没有内容)。

具体来说,我不小心让我的代码递归调用自己直到PHP,正确地放弃了。因此,服务器没有发送终端0长度的块 - 这是我之前发现的问题。

答案 1 :(得分:28)

我有这个问题。在尝试了这个问题上的大多数其他答案之后追踪它。它是由Output pixel = R: (input1+input4+input5)/3 G: (input2+input5)/2 B: (input3+input4)/2 的所有者和权限引起的,更具体地说是/var/lib/nginx目录不正确。

fast-cgi使用tmp目录在生成响应时缓存响应,但前提是它们高于特定大小。因此问题是间歇性的,只有在生成的响应很大时才会发生。

检查/var/lib/nginx/tmp以查看您是否有权限问题。

要修复,请确保nginx <host_name>.error_log的所有者和群组以及所有子目录都是nginx。

答案 2 :(得分:16)

以下内容应该为每个客户解决。

//Gather output (if it is not already in a variable, use ob_start() and ob_get_clean() )    

// Before sending output:
header('Content-length: ' . strlen($output));

但在我的情况下,以下是一个更好的选择并修复它:

htaccess的:

php_value opcache.enable 0

答案 3 :(得分:8)

OMG, I had the same problem 5 minutes ago. I spent several hours to find a solution. At first sight disabling antivirus solved problem on Windows. But then I noticed issue on other linux pc with no antivirus. No errors in nginx logs. My ReturnType ClassA::Function(B&) { ... } showed something about "Broken pipe" but not on all requests. Know what? It was no space left on device, which I found when restarted server on Database log, and uwsgi approved this. Only explanation about why antivirus was solved this is that it prevents browser caching (it should check every request), but browser with some strange behavior can simply ignore bad response and show cached responses.

答案 4 :(得分:4)

知道Chrome问题。根据Chrome和Chromium bug追踪器,没有通用的解决方案。此问题与服务器类型和版本无关,它在Chrome中是正确的。

Content-Encoding标题设置为identity解决了这个问题。

来自developer.mozilla.org

  

身份|表示身份功能(即没有压缩,也没有   修改)。

所以,我可以建议,在某些情况下,Chrome无法正确执行gzip压缩。

答案 5 :(得分:3)

就我而言,我遇到了/usr/local/var/run/nginx/fastcgi_temp/3/07/0000000073" failed (13: Permission denied),这可能导致Chrome net :: ERR_INCOMPLETE_CHUNKED_ENCODING错误。

我必须删除/usr/local/var/run/nginx/并让nginx再次创建它。

$ sudo rm -rf /usr/local/var/run/nginx/
$ sudo nginx -s stop
$ sudo mkdir /usr/local/var/run/nginx/
$ sudo chown nobody:nobody /usr/local/var/run/nginx/
$ sudo nginx

答案 6 :(得分:2)

这种情况发生在两个不同客户端的服务器上,这些服务器隔开了几年,使用的是相同的代码,这些代码在当时数百个其他服务器上部署而没有问题。

对于这些客户端,它主要发生在具有流HTML的PHP​​脚本上 - 即“连接:关闭”页面,其中输出在输出可用时发送到浏览器。

事实证明,PHP脚本和Web服务器之间的连接在脚本完成之前和任何超时前都过早地下降。

问题是主php.ini文件中的opcache.fast_shutdown = 1。默认情况下禁用此指令,但似乎有些服务器管理员认为此处有性能提升。在我的所有测试中,我从未注意到使用此设置的积极差异。根据我的经验,它导致一些脚本实际执行得更慢,并且在脚本仍在执行时有时进入关闭状态,甚至在Web服务器仍在从缓冲区读取时执行结束时都有可怕的跟踪记录。 2013年有一个旧的错误报告,截至2017年2月尚未解决,可能与以下内容有关:https://github.com/zendtech/ZendOptimizerPlus/issues/146

我看到由此出现以下错误 ERR_INCOMPLETE_CHUNKED_ENCODING ERR_SPDY_PROTOCOL_ERROR 有时会记录相关的段错误;有时不会。

如果您遇到任何一个,请检查您的phpinfo,并确保已禁用opcache.fast_shutdown。

答案 7 :(得分:2)

我只是盯着类似的问题。并注意到只有当页面包含序数值大于255(即多字节)的UTF-8字符时才会发生。

最终出现问题的是如何计算Content-Length标头。底层后端是计算字符长度,而不是字节长度。关闭内容长度标题会暂时解决问题,直到我可以修复后端模板系统。

答案 8 :(得分:2)

这里的问题是我的Avast AV。 一旦我禁用它,问题就消失了。

但是,我真的想了解这种行为的原因。

答案 9 :(得分:1)

如果您可以在本地主机中获得正确的响应并收到此类错误,并且您使用的是 nginx

  1. 转到服务器并使用以下命令打开 nginx.conf:

    nano etc/nginx/nginx.conf

  2. 在 http 块中添加以下行:

    proxy_buffering 关闭;

  3. 保存并退出文件

这解决了我的问题

答案 10 :(得分:1)

对不起,我不能给你一个准确的答案。但我确实也遇到过这个问题,至少在我的情况下,找到了解决方法。所以也许它会为那些了解更多关于Php的人提供一些线索。

场景是,我有一个传递给函数的数组。该数组的内容用于生成要发送回浏览器的HTML字符串,方法是将其全部放在后面打印的全局变量中。 (这个函数实际上并没有返回任何东西。邋,我知道,但是除了这一点之外。)在这个数组中,还有一些元素,通过引用,携带嵌套的关联数组,在此函数之外定义。通过消除过程,我发现在此函数中对此数组内的任何元素进行操作(包括或未引用),包括尝试取消设置这些引用的元素,都会导致Chrome抛出net :: ERR_INCOMPLETE_CHUNKED_ENCODING错误并且不显示任何内容。尽管事实上全局变量中的HTML字符串正是应该的样子。

只有通过重新设计脚本以不首先应用对数组元素的引用,才能使事情再次正常工作。我怀疑这实际上是一个Php bug,它与引用元素的存在有关,抛弃了内容长度的标题,但我真的不太了解这一点,可以肯定地说。

答案 11 :(得分:1)

这对我来说是完全不同的原因。 净额:: ERR_INCOMPLETE_CHUNKED_ENCODING 200 当我检查页面并转到newtork选项卡时,我看到vendor.js页面无法加载。经检查,似乎js文件的大小很大〜6.5 mb。那就是当我意识到我需要压缩js时。我检查了自己是否在使用ng build命令进行构建。相反,当我使用ng build --prod --aot --vendor-chunk --common-chunk --delete-output-path --buildOptimizer时,它对我有用。请参见https://github.com/angular/angular-cli/issues/9016

答案 12 :(得分:1)

如果有人可能与 MOODLE 有同样的问题,我只想与您分享我的经验。

我们的moodle平台突然非常缓慢,仪表板加载时间长达2-3倍(最多6秒),然后常常有些页面根本没有加载(不是404错误但是一页空白)。在开发人员工具控制台中,可以看到以下错误:net::ERR_INCOMPLETE_CHUNKED_ENCODING.

搜索此错误,看起来Chrome就是问题,但我们遇到了各种浏览器的问题。经过几个小时的研究和比较我最终发现问题前几天的数据库,有人开启了事件监控。但是,在“配置更改”日志中,此更改不可见!关闭事件监控,最终解决了问题 - 我们没有为事件监控定义规则。

我们使用MariaDB和PHP 5.4运行Moodle 3.1.2+。

答案 13 :(得分:1)

我在Chrome和Firefox中遇到了这个问题。如果我关闭了Avast Web Shield,它就会消失。我似乎设法通过在我的htaccess文件中添加一些html5样板htaccess来运行Web Shield:

# ------------------------------------------------------------------------------
# | Expires headers (for better cache control)                                 |
# ------------------------------------------------------------------------------

# The following expires headers are set pretty far in the future. If you don't
# control versioning with filename-based cache busting, consider lowering the
# cache time for resources like CSS and JS to something like 1 week.

<IfModule mod_expires.c>

    ExpiresActive on
    ExpiresDefault                                      "access plus 1 month"

  # CSS
    ExpiresByType text/css                              "access plus 1 week"

  # Data interchange
    ExpiresByType application/json                      "access plus 0 seconds"
    ExpiresByType application/xml                       "access plus 0 seconds"
    ExpiresByType text/xml                              "access plus 0 seconds"

  # Favicon (cannot be renamed!)
    ExpiresByType image/x-icon                          "access plus 1 week"

  # HTML components (HTCs)
    ExpiresByType text/x-component                      "access plus 1 month"

  # HTML
    ExpiresByType text/html                             "access plus 0 seconds"

  # JavaScript
    ExpiresByType application/javascript                "access plus 1 week"

  # Manifest files
    ExpiresByType application/x-web-app-manifest+json   "access plus 0 seconds"
    ExpiresByType text/cache-manifest                   "access plus 0 seconds"

  # Media
    ExpiresByType audio/ogg                             "access plus 1 month"
    ExpiresByType image/gif                             "access plus 1 month"
    ExpiresByType image/jpeg                            "access plus 1 month"
    ExpiresByType image/png                             "access plus 1 month"
    ExpiresByType video/mp4                             "access plus 1 month"
    ExpiresByType video/ogg                             "access plus 1 month"
    ExpiresByType video/webm                            "access plus 1 month"

  # Web feeds
    ExpiresByType application/atom+xml                  "access plus 1 hour"
    ExpiresByType application/rss+xml                   "access plus 1 hour"

  # Web fonts
    ExpiresByType application/font-woff                 "access plus 1 month"
    ExpiresByType application/vnd.ms-fontobject         "access plus 1 month"
    ExpiresByType application/x-font-ttf                "access plus 1 month"
    ExpiresByType font/opentype                         "access plus 1 month"
    ExpiresByType image/svg+xml                         "access plus 1 month"

</IfModule>

# ------------------------------------------------------------------------------
# | Compression                                                                |
# ------------------------------------------------------------------------------

<IfModule mod_deflate.c>

    # Force compression for mangled headers.
    # http://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping
    <IfModule mod_setenvif.c>
        <IfModule mod_headers.c>
            SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
            RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
        </IfModule>
    </IfModule>

    # Compress all output labeled with one of the following MIME-types
    # (for Apache versions below 2.3.7, you don't need to enable `mod_filter`
    #  and can remove the `<IfModule mod_filter.c>` and `</IfModule>` lines
    #  as `AddOutputFilterByType` is still in the core directives).
    <IfModule mod_filter.c>
        AddOutputFilterByType DEFLATE application/atom+xml \
                                      application/javascript \
                                      application/json \
                                      application/rss+xml \
                                      application/vnd.ms-fontobject \
                                      application/x-font-ttf \
                                      application/x-web-app-manifest+json \
                                      application/xhtml+xml \
                                      application/xml \
                                      font/opentype \
                                      image/svg+xml \
                                      image/x-icon \
                                      text/css \
                                      text/html \
                                      text/plain \
                                      text/x-component \
                                      text/xml
    </IfModule>

</IfModule>

# ------------------------------------------------------------------------------
# | Persistent connections                                                     |
# ------------------------------------------------------------------------------

# Allow multiple requests to be sent over the same TCP connection:
# http://httpd.apache.org/docs/current/en/mod/core.html#keepalive.

# Enable if you serve a lot of static content but, be aware of the
# possible disadvantages!

 <IfModule mod_headers.c>
    Header set Connection Keep-Alive
 </IfModule>

答案 14 :(得分:1)

在我的情况下,它发生在json序列化web api返回有效负载期间 - 我有一个&#39;循环&#39;在我的实体框架模型中引用,我返回一个简单的一对多对象图,但是孩子有一个引用回父母,这显然是json序列化器doensn不喜欢。删除引用父项的子项上的属性可以解决问题。

希望这有助于可能遇到类似问题的人。

答案 15 :(得分:1)

我的修复是:

<?php  ob_start(); ?>
<!DOCTYPE html>
<html lang="de">
.....
....//your whole code
....
</html>
<?php
        ob_clean();
ob_end_flush();

ob_flush();

?>

希望这将有助于未来的某些人,在我的情况下,这是一个卡巴斯基问题,但上面的解决方案很有效:)

答案 16 :(得分:1)

对我来说,这是由于硬盘驱动器上的可用空间不足所致。

答案 17 :(得分:0)

检查nginx文件夹权限并为其设置访问权限:

chown -R www-data:www-data /var/lib/nginx

答案 18 :(得分:0)

嗯,我偶然发现了一个类似的问题,但背后有不同的原因......

我在 Laravel Mix 的vanilla PHP项目中使用 Laravel Valet 。当我在Chrome中打开网站时,会出现net::ERR_INCOMPLETE_CHUNKED_ENCODING错误。 (如果我在HTTPS协议上加载了网站,则错误更改为net::ERR_SPDY_PROTOCOL_ERROR。)

我检查了php.ini并且opcache未启用。我发现在我的情况下,问题与版本化资产文件有关 - 出于某种原因,它似乎不喜欢资产的URL中的查询字符串(好吧,奇怪的是,只有一个特别?)。

我已针对本地环境删除mix.version(),并且该网站在我的Chrome上在HTTP和HTTPS协议上加载得很好。

答案 19 :(得分:0)

最简单的解决方案是在nginx.conf中将您设置的代理位置的proxy_read_timeout设置为更高的值(例如120s)。

location / {
....
proxy_read_timeout 120s
....
}

我在这里找到了这个解决方案 https://rijulaggarwal.wordpress.com/2018/01/10/atmosphere-long-polling-on-nginx-chunked-encoding-error/

答案 20 :(得分:0)

当我遇到此错误时(通过javascript进行AJAX调用时);原因是控制器的响应是错误的;它返回的不是有效格式的JSON。

答案 21 :(得分:0)

我的应用程序有同样的问题。我的项目使用的是DevOps,问题是由于计算不健康。替换它们为我解决了这个问题

答案 22 :(得分:0)

我已从http://重定向到https://,此问题已解决!

答案 23 :(得分:0)

我非常确定此问题可能有多个原因-在服务器端和客户端均如此。

最近我遇到了一个我在VPS上托管的网站(Ubuntu 18.04,PHP 7.4 FPM,nginx + certbot,该网站由WordPress提供支持)—加载管理页面时没有CSS / JS。

我花了几个小时来尝试不同的解决方案,但都没有帮助。

最后,我发现由于某种原因(可能是我较早更改了它,但是我不能排除默认情况下像这样的可能性),该文件的第一行是评论:

/etc/nginx/nginx.conf

我取消了评论,用# user www-data 重新启动了nginx,问题消失了。

如果任何人都可以在安装了nginx的原始Ubuntu 18.04上进行检查(如果默认情况下此行已注释,请将该行注释)。

答案 24 :(得分:0)

就我而言,这是一个草率的应用程序问题。正在对包含草率的include的PHP进行AJAX调用(在其中的两个include中,PHP关闭定界符后有空白)。这意味着将在预期的JSON输出之前向响应输出空格。我只是在将Header for JSON输出放在响应之前时才发现此问题,并且将分块错误替换为“因为发生了输出而无法发送标头”的错误。换句话说,AJAX期待一个JSON响应,并且得到了-某种程度-但响应不是干净的,因为JSON响应前面不应有白色。当查看Firebug网络中PHP的响应时,这很明显-由于前导空格,该响应在面板中看起来很合理。奇怪的是,并不是所有的空白都会触发错误-仅在响应的整个长度超过某个特定长度时才会发生分块错误。

答案 25 :(得分:0)

我通过将数据类型从'.js'更改为'.json'来解决了这个问题。

答案 26 :(得分:0)

我遇到了这个问题(在Chrome中显示ERR_INCOMPLETE_CHUNKED_ENCODING,在其他浏览器中没有显示)。原来问题是我的托管服务提供商GoDaddy在我的输出结束时添加了一个监控脚本。

https://www.godaddy.com/community/cPanel-Hosting/how-to-remove-additional-quot-monitoring-quot-script-added/td-p/62592

答案 27 :(得分:0)

在Drupal 8(Symfony Framework)中的Controller的上下文中,这个解决方案对我有用:

$response = new Response($form_markup, 200, array(
  'Cache-Control' => 'no-cache',
));

$content = $response->getContent();
$contentLength = strlen($content);
$response->headers->set('Content-Length', $contentLength);

return $response;

否则响应标题'Transfer-Encoding'得到一个值'chunked'。这可能是Chrome浏览器的问题。

答案 28 :(得分:0)

我得到net::ERR_INCOMPLETE_CHUNKED_ENCODING,仔细检查服务器错误,我发现这是由于PHP脚本执行超时造成的。

在PHP脚本之上添加此行为我解决了这个问题:

ini_set('max_execution_time', 300); //300 seconds = 5 minutes

参考:Fatal error: Maximum execution time of 30 seconds exceeded

答案 29 :(得分:0)

很有趣,看看这个问题有多少不同的原因!

很多人说这是Chrome问题,所以我尝试了Safari,但仍有问题。然后尝试了这个线程中的所有解决方案,包括关闭我的AVG实时保护,没有运气。

对我来说,问题是我的.htaccess文件。它包含的全部内容为FallbackResource index.php,但当我将其重命名为htaccess.txt时,我的问题已得到解决。

答案 30 :(得分:0)

就我而言,它是html的问题。有&#39; \ n&#39;在json响应导致问题。所以我删除了它。

答案 31 :(得分:0)

这似乎是多种原因和解决方案的常见问题,因此我将在这里为任何可能需要它的人提供我的答案。

我在Chrome,osx,php70,httpd24组合上获得net::ERR_INCOMPLETE_CHUNKED_ENCODING,但相同的代码在生产服务器上运行良好。

我最初将常规日志记录下来但没有真正显示出来。快速ls -later显示system.log/var/log中最新的触摸文件,拖尾给了我

Saved crash report for httpd[99969] version 2.4.16 (805) 
to /Library/Logs/DiagnosticReports/httpd.crash

包含在:

Process:               httpd [99974]
Path:                  /usr/sbin/httpd
Identifier:            httpd
Version:               2.4.16 (805)
Code Type:             X86-64 (Native)
Parent Process:        httpd [99245]
Responsible:           httpd [99974]
User ID:               70

PlugIn Path:             /usr/local/opt/php70-mongodb/mongodb.so
PlugIn Identifier:       mongodb.so

brew uninstall php70-mongodbhttpd -k restart之后,一切顺利。

答案 32 :(得分:0)

在我的情况下,服务器上的mysqlnd_ms php扩展名的配置被破坏了。有趣的是,它在持续时间短的请求上运行良好。服务器错误日志中有警告,因此我们已快速修复它。

答案 33 :(得分:0)

我的猜测是服务器没有正确处理分块传输编码。它需要终止带有终端块的分块文件,以指示整个文件已被转移。所以下面的代码可能有效:

echo "\n";
flush();
ob_flush();
exit(0);

答案 34 :(得分:0)

如果有任何循环或项目不存在,那么您将面临此问题。

在Chrome上运行应用时,该页面为空白且无响应。

场景开始:

开发环境:MAC,STS 3.7.3,tc Pivotal Server 3.1,Spring MVC Web,

in $ {myObj.getfName()}

场景结束:

问题原因:未在myObj上定义getfName()函数。

希望对你有所帮助。

答案 35 :(得分:0)

好。不久前我也遇到了这个问题。最后,我得到了真正解决这个问题的解决方案。

我的问题症状也是页面没有加载,发现json数据被随机截断。

以下是我总结可以帮助解决此问题的解决方案

1.Kill the anti-virus software process
2.Close chrome's Prerendering Instant pages feature
3.Try to close all the apps in your browser
4.Try to define your Content-Length header
  <?php
     header('Content-length: ' . strlen($output));
  ?>
5.Check your nginx fastcgi buffer is right 
6.Check your nginx gzip is open

答案 36 :(得分:-1)

通常,当客户端在客户端事件旁边向服务器发送一连串的请求时,会出现这种情况。

这通常是客户端编程“不良”的迹象。

想象一下,我正在更新表的所有行。

不好的方法是发送一个更新每一行的请求(许多请求在流浪中而不等待请求完成)。要更正它,请确保该请求已完成,然后再发送另一个。

一个好的方法是发送一个包含所有更新行的请求。 (一个请求)

因此,首先,请查看客户端正在发生的情况,并在必要时重构代码。

使用wireshark识别请求中出了什么问题。