CodeIgniter“内容编码错误”

时间:2012-06-10 18:22:25

标签: php apache codeigniter encoding

是否有任何机构知道如何在CodeIgniter中找到导致{“1}}”内容编码错误的泄漏位置?

我试图将此错误调试好几天,但我似乎无法找到泄漏的位置。 $config['compress_output'] = true位于LogLevel,但发生此错误时,我在日志中看不到任何信息。

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

更新

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

UPDATE2

我一遍又一遍地看着控制器中是否有任何输出......并且没有输出,所以其他一些必须是错误引发的。没有模型/数据库,只有控制器,库,帮助器和视图

7 个答案:

答案 0 :(得分:17)

此问题是输出缓冲开始的地方。对配置变量的检查位于system/core/Output.php中的_display()。在很多代码运行后,它启动gzipped缓冲。这样就可以在缓冲开始之前发生输出。

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

有两种解决方案:

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分: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>
&#13;
&#13;
&#13;

答案 3 :(得分:1)

  1. PHP中的任何错误都会破坏压缩。

    要测试这一点,请在index.php中更改:

    error_reporting(E_ALL);  
    

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

  3. 请勿使用“?&gt;”在控制器文件的末尾。

  4. 我希望它有所帮助。

    <强>更新

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

    ob_flush();
    

    ob_start('ob_gzhandler');
    

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

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

答案 4 :(得分:1)

我遇到了同样的问题。搜索之后,我发现我的控制器在文件末尾有?>。所以我删除它,它完美地工作。这是link以获取更多详细信息。

答案 5 :(得分:0)

更兼容的解决方案:

$this->output->set_output($data);

答案 6 :(得分:0)

某些CPanel lightspeed扩展名更新会造成此问题。您可以尝试将此代码添加到.htaccess文件中:

php_flag zlib.output_compression ON