#!/usr/bin/perl use strict; use POSIX; ### Time span to be expired use constant EXPIRES => 60 * 60 * 24 * 365; # sec ### File extension part into MIME types my %ext2mime = ( 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'gif' => 'image/gif', 'png' => 'image/png', ); ### Document Root my $script_filename = $ENV{'SCRIPT_FILENAME'}; my $script_name = $ENV{'SCRIPT_NAME'}; $script_filename =~ s!/\Q$script_name\E$!!; ### File Informations my $req_path = $script_filename. $ENV{'REQUEST_URI'}; my( $filepath ) = $req_path =~ m!^([^\?]+)!; -f $filepath or die 'File not found'; my( $file_ext ) = $filepath =~ m!\.(.+?)$!; $ext2mime{$file_ext} or die 'Invalid MIME type'; ### Content Header $|++; my $cur_time = time; my @filestat = stat $filepath; printf "Date: %s\n", POSIX::strftime( '%a, %d %b %Y %T GMT', gmtime( $cur_time ) ); printf "Server: %s\n", $ENV{'SERVER_SOFTWARE'}; printf "Last-Modified: %s\n", POSIX::strftime( '%a, %d %b %Y %T GMT', gmtime( $filestat[9] ) ); printf "Expires: %s\n", POSIX::strftime( '%a, %d %b %Y %T GMT', gmtime( $cur_time + EXPIRES ) ); printf "Connection: %s\n", $ENV{'HTTP_CONNECTION'}; printf "Accept-Ranges: bytes\n"; printf "Content-Length: %d\n", $filestat[7]; printf "Content-Type: %s\n", $ext2mime{$file_ext}; printf "\n"; ### Content Body if( open( my $fh, "<$filepath" )) { binmode STDOUT; print STDOUT <$fh>; close $fh; }