3

I'm using Apache's mod_rewrite to route requests for JPG files to a directory outside my web root.

It generally has been fine, but there are a few images that do not display. I then realized that when I use PHP's get_headers() function on my image URLs, they are all returning
Content-Type: text/html; charset=UTF-8 instead of the proper image/jpeg header types.

I have tried explicitly setting the Content-Type: image/jpeg header and still, none of my images return the correct headers - although most do display correctly, but I'm not sure why.

How can I assure a JPG file is sent with the correct header when redirecting via mod_rewrite?

Teun Zengerink
  • 4,277
  • 5
  • 30
  • 32
Brian
  • 2,107
  • 6
  • 22
  • 40

3 Answers3

12

This is what you could do. Create a PHP file that will get the right file and passes it through

<?php 
$sImage = 'imagename.jpg';
header("Content-Type: image/jpeg");
header("Content-Length: " .(string)(filesize($sImage)) );

echo file_get_contents($sImage);

or

<?php
$sImage = 'imagename.jpg';
$rFP = fopen($sImage, 'rb');

header("Content-Type: image/jpeg");
header("Content-Length: " .(string)(filesize($sImage)) );

fpassthru($rFP);
exit;

or in your Apache vhost config or .htaccess file

RewriteRule … … [T=image/jpeg]
Robert Cabri
  • 3,821
  • 1
  • 20
  • 17
9

You can also set the Content-Type header field with mod_rewrite with the T flag:

RewriteRule … … [T=image/jpeg]
Gumbo
  • 643,351
  • 109
  • 780
  • 844
0

How about image which is not.jpg. Like .gif, ...

You'll need to use mime_content_type() (which is deprecated) or the fileinfo extension to determine which content-type to send.

Edit: I don't recommend this, but if you are working with a specific subset of file extensions, you could also create a small dictionary array of content-types and use the file extension to determine which one to send.

simshaun
  • 21,263
  • 1
  • 57
  • 73