6

有没有人知道如何$config['compress_output'] = true在 CodeIgniter 中找到引发此“内容编码错误”的泄漏点?

我已经尝试调试这个错误好几天了,但我似乎无法找到泄漏的位置。LogLevel是在,debug但发生此错误时,我在日志中看不到任何信息。

那么,任何想法如何调试呢?

更新

我真的不想禁用该compress_output功能,我只想看看如何追踪错误产生的位置

更新2

我一遍又一遍地查看控制器中是否有任何输出......并且没有,所以其他一些地方一定是引发了错误。没有模型/数据库,只有控制器、库、助手和视图

4

7 回答 7

18

这个问题是输出缓冲开始的地方。对配置变量的检查system/core/Output.php_display(). 它在大量代码已经运行后启动 gzipped 缓冲。这使得输出有可能在缓冲开始之前发生。

compress_output设置为false没关系,因为没有任何编码。将它设置为true您最终会得到混合内容。有些输出是编码的,有些不是,这会导致压缩错误。

有两种解决方案:

1) 您可以将compress_output设置保留为 false 并添加ob_start('ob_gzhandler');到 index.php 文件的顶部。这将确保所有输出始终被压缩,包括错误。

2)另一种解决方案是在之前ob_flush();添加。这将在没有错误时输出 gzip 并在有错误时为您提供未编码的内容。ob_start('ob_gzhandler');system/Output.php

我认为 2 是更好的解决方案,应该由 CodeIgniter 团队实施。但是,如果您不想弄乱系统代码(升级时更改将消失),那么 1 对您来说是更好的解决方案。

于 2012-06-13T01:27:29.767 回答
2

这可能是一个长镜头,但如果您直接从控制器回显/打印数据库输出而不是将其发送到模型,您可能会收到与输出缓冲有关的错误消息。你是从你的控制器回响吗?

于 2012-06-15T18:15:23.813 回答
2

将以下行放在 config.php 中:

$config['compress_output'] = FALSE;

解决它。就我而言,问题是我发送了帖子,但它无法识别该FILLCATEGORIAS功能。只有通过改变$ config [ 'compress_output'] = FALSE;解决了它。

当我们使用 POST 请求发送数据时出现此问题:

加载资源失败:net::ERR_CONTENT_DECODING_FAILED

<script type="text/javascript">   
            $(document).ready(function() {                       
                $("#idEmpresa").change(function() {
                    $("#idEmpresa option:selected").each(function() {
                        id = $('#idEmpresa').val();
                        $.post("<?php echo base_url();?>Admin/fillCategorias", {
                            idEmpresa : id
                        }, function(data) {
                            $("#idCategoria").html(data);
                        });
                    });
                });
            });
        </script>

于 2016-05-04T05:01:02.943 回答
1
  1. PHP 中的任何错误都会破坏压缩。

    要对此进行测试,请在 index.php 中更改:

    error_reporting(E_ALL);  
    

    error_reporting(E_ALL ^ E_NOTICE);
    
  2. 不要回显/打印以显示控制器的输出。

  3. 不要在控制器文件的末尾使用“?>”。

我希望它有所帮助。

更新:

要在开始缓冲之前检查输出是否为空,可以打开 core/Output.php 并添加

ob_flush();

ob_start('ob_gzhandler');

如果甚至有空格或空行,压缩将失败。(从浏览器检查页面源)。发生这种情况是因为 $config['compress_output'] = true 会执行 ob_start('ob_gzhandler') (Output.php 中的第 379 行),这将导致“无法修改标头信息 - 标头已发送... ”警告。此警告是压缩失败的原因。

所以基本上,输出类(包括json输出)之外的任何回显都会将标头发送到客户端,这将导致“无法修改标头信息 - 标头已发送... ”警告,这将导致“内容编码错误”。

于 2012-06-16T00:26:12.917 回答
1

我有同样的问题。搜索后,我发现我的控制器?>在文件末尾。所以我删除了它,它工作得很好。这是更多详细信息的链接

于 2012-12-31T05:24:06.340 回答
0

更合规的解决方案:

$this->output->set_output($data);
于 2020-01-24T11:08:56.490 回答
0

一些 CPanel lightspeed 扩展更新会产生这个问题。您可以尝试在.htaccess文件中添加此代码:

php_flag zlib.output_compression ON
于 2020-09-26T20:49:06.273 回答