我正在使用 CodeIgniter 2 中的控制器根据其 URL 生成调整大小的图像,但是图片在我们的一台服务器上被随机截断(仅显示前三分之二左右)。我相信这个问题与生成图片时使用的 GZIP 有关,但是当我关闭压缩时很难一致地重现并且完全消失。
有趣的是,只有在压缩 text/html 时,才会将 GZIP 压缩添加到输出的 JPEG 中。
这是我的 apache 配置:
<IfModule mod_deflate.c>
<FilesMatch "(?<!\.jpg)$">
AddOutputFilterByType DEFLATE text/html
</FilesMatch>
</IfModule>
<FilesMatch "\.jpg$" >
SetEnv no-gzip dont-vary
RemoveOutputFilter php
</FilesMatch>
我的 htaccess 文件包含这个
SetEnvIfNoCase Request_URI ".jpg$" no-gzip dont-vary
<FilesMatch "\.(gif|jpe?g|png)$">
SetEnv no-gzip dont-vary
</FilesMatch>
PHP 代码看起来像这样
//code to generate the image and save it to the hard drive goes here
//output the file
$binarydata = file_get_contents($directory.$file);
$offset = 5184000;
header("Cache-Control: must-revalidate");
header('Content-Type: image/jpeg');
header('Expires: '. gmdate('D, d M Y H:i:s', $dbrecord->updated_at->format("U") + $offset) .' GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s', $dbrecord->updated_at->format("U")) .' GMT');
header('Accept-Ranges: bytes');
header("Content-Disposition: inline; filename=".$file);
header('Content-Length: '.strlen($binarydata));
print($binarydata);
die();
照片的 URL 类似于http://example.com/photo/100x100-abc.jpg,如您所见,有四种不同的方法可以避免设置压缩,但仍然设置。
我已经分别尝试了以上所有方法并结合使用,但无济于事。我无能为力,有人可以帮忙吗?
更新:我删除了内容长度标头,apache 并没有自行设置它,但我们刚刚发现了一些有趣的东西,这个问题只发生在 Chrome 和 Safari 而不是 Firefox 所以我想知道这是否也与 webkit 相关?