图片过期时间

The google page speed tool recommends me to set 'Expires' headers for images etc. But what is the most efficient way to set an Expires header for an image?

In now redirect all image requests to an imagehandler.php using htaccess:

/*
HTTP/1.1 404 Not Found, HTTP/1.1 400 Bad Request and content type detection stuff
...
*/

header( "Content-Type: " . $content_type );
header( "Cache-Control: public" );
header( "Last-Modified: ".gmdate("D, d M Y H:i:s", filemtime($path))." GMT");
header( "Expires: ". date("r",time() + (60*60*24*30)));
readfile( $path );

But of course this adds extra loading time for my images on first request, and I was wondering if there was a better solution for this.

You can add it in the .htaccess file.

<FilesMatch "\.(ico|jpg|jpeg|png|gif)$">
Header set Cache-Control "max-age=290304000, public"
</FilesMatch>

Found on AskApache.

Of course, if you want the images changed, they won't be downloded again until they expire.

You can solve that by doing something like this

function getImage($path) {
    // may need to add a DOCROOT constant here before filemtime() argument
    return $path . '?m=' . substr(filemtime($path) -5);

}

I just use the substr() to make it a little shorter. The chances of them colliding is minimum, but may happen. Be sure to test it.

Use it like this

<img src="<?php echo getImage('path/to/your/image.jpg'); ?>" alt="" />