同时使用分块传输编码和gzip压缩技术

3

我最近在网站上开始使用gzip,所有浏览器都能正常使用,除了Opera浏览器会报错,提示无法解压缩内容,因为数据损坏。通过测试和搜索得知,这可能是同时使用gzip和分块传输编码的问题。请求像css文件这样的小文件时没有错误,也支持这个方向。

这是已知的问题吗?还是有什么我没有考虑到的问题?

有人还提到这可能与发送Content-Length头部有关。

以下是我代码中最相关部分的简化版本:

$contents = ob_get_contents();
ob_end_clean();
header('Content-Encoding: '.$encoding);
print("\x1f\x8b\x08\x00\x00\x00\x00\x00");
$size = strlen($contents);
$contents = gzcompress($contents, 9);
$contents = substr($contents, 0, $size);
print($contents);
exit();

2
你的第一个输出是什么意思,为什么在这种情况下使用 substr - Gumbo
2个回答

7

GZip和分块编码在Web上经常一起使用,因此我怀疑问题不仅仅是由它引起的。

如果使用分块编码,就不应该发送Content-Length头。

此外,当您协商gzip时,应发送Vary:Accept-Encoding(对于压缩和未压缩的响应),如果您发送ETags,则需要对压缩和未压缩的响应分别设置不同的值。

尝试通过http://redbot.org/运行URL-它会检查gzip编码中的一些常见问题。


2

理想情况下,您应该检查来自客户端的请求头,以确保它支持编码响应。要查找的标头是:"Accept-Encoding: gzip,deflate"。您还应该检查客户端是否使用HTTP 1.1。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接