代码点火器“内容编码错误”


CodeIgniter "content encoding error"

是否有人知道如何找到在CodeIgniter中引发$config['compress_output'] = true"内容编码错误"的泄漏位置?

几天来我一直在尝试调试此错误,但我似乎找不到泄漏的位置。 LogLeveldebug,但是发生此错误时,我在日志中看不到任何信息。

那么,有什么想法可以调试吗?

更新

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

UPDATE2

我一遍

又一遍地查看控制器中是否有任何输出......而且没有,所以有些其他地方一定是挑起的错误。没有模型/数据库,只有控制器、库、帮助程序和视图

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

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

有两种解决方案:

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

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

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

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

将以下行放入 config.php:

$config['compress_output'] = FALSE;

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

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

无法加载资源:净::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>

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

    为了测试这一点,在索引中.php更改:

    error_reporting(E_ALL);  
    

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

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

我希望它有所帮助。

更新:

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

ob_flush();

以前

ob_start('ob_gzhandler');

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

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

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

更合规的解决方案:

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

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

php_flag zlib.output_compression ON