1

I am using a controller in CodeIgniter 2 to generate a resized image based on its URL however the pictures are getting randomly cut off on one of our servers (only the top two thirds or so get shown). I believe the problem is related to GZIP being used when the picture is generated but it is difficult to reproduce consistently and disappears entirely when I turn compression off.

Interestingly, the GZIP compression is only added to the outputted JPEG when the text/html is being compressed.

This is my apache configuration:

<IfModule mod_deflate.c>
    <FilesMatch "(?<!\.jpg)$">
        AddOutputFilterByType DEFLATE text/html
    </FilesMatch>
</IfModule>
<FilesMatch "\.jpg$" >
    SetEnv no-gzip dont-vary
    RemoveOutputFilter php
</FilesMatch>

My htaccess file contains this

SetEnvIfNoCase Request_URI ".jpg$" no-gzip dont-vary

<FilesMatch "\.(gif|jpe?g|png)$">
    SetEnv no-gzip dont-vary
</FilesMatch>

PHP code looks like this

//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();

The URL of the photo would be something like http://example.com/photo/100x100-abc.jpg and as you can see, there are four different ways of trying to avoid the compression being set however it is still set.

I have tried all the methods above separately and combined but to no avail. I am at my wits end, can anyone help?

UPDATE: I removed the content length header and apache did not set it on its own but we have just discovered something interesting, the problem only occurs in Chrome and Safari and not Firefox so I wonder if this is also webkit related?

  • View the headers coming through, check that `Content-Length` string isn't being altered or wrongly supplied. – Orbling Jun 28 '13 at 17:08
  • @Orbling I tried removing that completely to no avail. Presumably the content length will be greater as GZIP is compressing a compressed format – willpower232 Jun 28 '13 at 17:19
  • As Apache often adds that header, I thought it might transparently alter it and cutoff the request early. Best to look client side. – Orbling Jun 28 '13 at 17:21
  • @Orbling see update above, apache does not add the `Content-Length` header after I remove it – willpower232 Jul 01 '13 at 08:22

0 Answers0