Symfony5中设置全局响应Content-Encoding:gzip头后出现“Error while processing content unencoding: incorrect header check”错误的解决办法
解决Symfony 5中设置gzip响应头后的“incorrect header check”错误
你遇到的这个报错本质很简单:你给客户端返回了Content-Encoding: gzip的响应头,但实际的响应内容根本没有经过gzip压缩。客户端收到后会按照头信息尝试解压普通文本内容,自然就会抛出“incorrect header check”的错误。
下面给你两种解决方案,优先推荐第一种官方内置方案:
方案一:使用Symfony内置的HTTP压缩(推荐)
Symfony 5已经内置了成熟的HTTP压缩支持,完全不需要自己写事件监听器。只需要在config/packages/framework.yaml里启用配置即可:
framework: # 保留你原本的其他配置... http_kernel: # 其他已有配置,比如enable_http_method_override... compression: true
这个配置会自动帮你处理所有细节:
- 检查客户端是否通过
Accept-Encoding头支持gzip压缩 - 仅在支持时才压缩响应内容并设置对应的
Content-Encoding头 - 自动处理
Content-Length和Vary等标准头 - 避免手动实现可能出现的各种兼容性问题
启用后,你可以删掉自己写的RequestListener和services.yaml里对应的注册配置,避免冲突。
方案二:修正自定义监听器的代码(如果非要自己实现)
如果你坚持要用自定义事件监听器来处理压缩,那必须在设置响应头之前,实际对响应内容进行gzip压缩。修改你的RequestListener.php代码如下:
<?php namespace App\Api\EventListener; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\ResponseEvent; class RequestListener { public function onKernelResponse(ResponseEvent $responseEvent) { if (!$responseEvent->isMasterRequest()) { return; } /** @var Response $response */ $response = $responseEvent->getResponse(); // 先检查客户端是否支持gzip压缩(遵循HTTP标准) $request = $responseEvent->getRequest(); $acceptEncoding = $request->headers->get('Accept-Encoding', ''); if (false === strpos($acceptEncoding, 'gzip')) { return; // 客户端不支持,直接返回原内容 } // 对响应内容进行gzip压缩(9是最高压缩级别) $compressedContent = gzencode($response->getContent(), 9); // 更新响应内容和对应的头信息 $response->setContent($compressedContent); $response->headers->set('Content-Encoding', 'gzip'); // 必须更新Content-Length为压缩后的长度 $response->headers->set('Content-Length', strlen($compressedContent)); // 添加Vary头,告诉缓存服务器响应依赖于Accept-Encoding头 $response->headers->set('Vary', 'Accept-Encoding'); } }
这里有几个关键细节必须注意:
- 一定要检查客户端的
Accept-Encoding头,不要强制给不支持gzip的客户端返回压缩内容 - 必须用
gzencode()实际压缩内容,不能只设置头 - 更新
Content-Length为压缩后的内容长度,否则客户端可能会认为内容不完整 - 添加
Vary头是HTTP规范的要求,能避免缓存服务器返回错误的编码内容
内容的提问来源于stack exchange,提问作者kellymandem
相关产品推荐
相关产品推荐

