【问题标题】:How to set correct Content-Encoding如何设置正确的内容编码
【发布时间】:2011-09-14 13:41:57
【问题描述】:

我对 HTTP 标头:Content-Encoding 有一些严重(或者更好地说:奇怪)问题。

我想在将内容发送到客户端浏览器之前对其进行 gzip 压缩。为此,我正在检查客户端浏览器是否接受 gzip,如果是,我正在使用 ob_start("ob_gzhandler") 并设置内容编码:$response->addHeader("Content-Encoding", "gzip");

  • 我认为我的问题是手动设置 Content-Encoding 标头。 如果我使用$response->addHeader("Content-Encoding", "gzip");,则内容仅显示在 Opera 中。

  • 如果我使用$response->addHeader("Content-Encoding", "'gzip'");,则内容在所有浏览器中都显示正确,但 gzip 压缩检查表明它未压缩并且 W3C HTML 验证服务无法对页面进行编码:

错误是:不知道如何解码 Content-Encoding ''gzip''

  • 如果我不使用线和在线使用ob_start("ob_gzhandler")页面只能在opera中显示

我在浏览器中正确输出的完整代码行如下:

$accEncoding = $request->getHeader("http_accept_encoding");
if($accEncoding !== NULL && substr_count($accEncoding, 'gzip')) {
    ob_start("ob_gzhandler");
    $response->addHeader("Content-Encoding", "'gzip'");
    $response->addHeader("Vary", "Accept-Encoding");
} else {
    ob_start();
}

我是在使用 ob_gzhandler 错误还是在这里犯了其他错误?我对正确处理 gzip 输出感到非常困惑。

【问题讨论】:

标签: php http-headers


【解决方案1】:

ob_gzhandler已经验证浏览器支持gzip压缩:

在 ob_gzhandler() 实际发送压缩数据之前,它会确定浏览器将接受哪种类型的内容编码(“gzip”、“deflate”或根本不接受)并相应地返回其输出。

它还相应地设置 Content-Encoding 标头。

另请注意,使用zlib.output_compression 优于 ob_gzhandler()。

【讨论】:

  • 如果我改用以下代码,我会在 firefox 和 chrome 中遇到编码错误: if(!ob_start("ob_gzhandler")) { ob_start(); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
相关资源
最近更新 更多