我阅读了一些关于设置将要提供的文件的内容长度的文章。与分块下载相比,它有一些好处。当内容长度未知时,服务器提供块(不知道块的大小是多少)。
在PHP中,我使用ob_gzhandler来gzip html,js和css文件以及其他基于文本的内容。在gzip输出之前设置原始内容长度会导致奇怪的副作用,因为长度与gzip输出的长度不匹配。我注意到延迟或浏览器报告编码错误。
我看到一个技巧(也在stackoverflow上)来设置gzip压缩后的内容长度,以确保它报告正确的大小。但是当我这样做时,内容不再被压缩。
问题是,这种行为是否正确? gzip压缩内容是否始终发送?仅对于未压缩的文件是否需要内容长度?
这里有一些代码片段:
1 gzip和chunked文件传输的结果:
ob_start('ob_gzhandler');
echo $sResult;
2 在指定内容长度的正常文件传输中的结果(但期望gzip和内容长度):
ob_start('ob_gzhandler');
echo $sResult;
header('Content-Length: '.ob_get_length());
这里有一些http标题的图片结果: 的 1
2
答案 0 :(得分:2)
在这里找到解决方案/技巧: How to determine the Content-Length of a gzipped file?
制作于此:
// clear output buffers
while( ob_get_level() )
{ ob_end_clean(); }
< send http headers here >
ob_start();
ob_start('ob_gzhandler');
echo $sResult;
if( !headers_sent() )
{
ob_end_flush(); // Flush the output from ob_gzhandler
header('Content-Length: '.ob_get_length());
ob_end_flush(); // Flush the outer ob_start()
}
对我而言,目前尚不清楚为什么这样可行,但似乎完美无缺。内容现在是gzip压缩的,并且内容长度(不分块)。
为了证明这一点,这是一个截图:
干杯! ; - )