CodeIgniter 2 のコントローラーを使用して URL に基づいてサイズ変更された画像を生成していますが、サーバーの 1 つで画像がランダムに切り取られています (上位 3 分の 2 のみが表示されます)。この問題は、画像の生成時に GZIP が使用されていることに関連していると思いますが、一貫して再現するのは難しく、圧縮をオフにすると完全に消えてしまいます。
興味深いことに、GZIP 圧縮は、text/html が圧縮されているときにのみ、出力された 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のようになります。ご覧のように、圧縮が設定されないようにするには 4 つの異なる方法がありますが、設定されたままです。
上記のすべての方法を個別に試したり、組み合わせたりしましたが、役に立ちませんでした。私は頭が痛いです、誰か助けてくれますか?
更新: コンテンツの長さヘッダーを削除しましたが、apache は独自に設定していませんでしたが、興味深いことを発見しました。問題は Chrome と Safari でのみ発生し、Firefox では発生しないので、これも Webkit に関連しているのでしょうか?