Example: Last-Modified Headers in Scripts
This Perl CGI script shows one way to use Last-Modified header in scripts, for demonstration purposes.
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use CGI::Util;
use Date::Parse;
my $q = new CGI;
my $last_mod = $ENV{HTTP_IF_MODIFIED_SINCE};
if (defined $last_mod)
{
$last_mod = str2time($last_mod);
if (time() - $last_mod < 60)
{
print $q->header(-status=>304);
exit 0;
}
}
print $q->header(-type => "text/html", -status => 200,
-last_modified => CGI::Util::expires("now"));
print "<html><body>\n<h1>Last-Modified Test</h1>\n" .
"<p>Date: ".scalar localtime()."</p>\n" .
"<table>\n";
foreach my $var (sort keys %ENV)
{
next unless $var =~ /^HTTP_/;
print "<tr><td>$var</td><td>$ENV{$var}</td></tr>\n";
}
print "</table></body></html>\n";
exit 0;
The script starts by checking for an HTTP If-Modified-Since header from the browser. If it gets one, and the modification date was within the last 60 seconds, it sends a 304 Not Modified response.
If not, it sends a response body with a Last-Modified header set to the current time, which the browser will send back on subsequent requests in the If-Modified-Since header.
The effect is that when you load the script through a CGI web server, it will display a response like this:
Last-Modified Test
Date: Fri Aug 3 17:02:08 2007
| HTTP_ACCEPT | text/xml,application/xml,application/xhtml+xml,... |
| HTTP_ACCEPT_CHARSET | ISO-8859-1,utf-8;q=0.7,*;q=0.7 |
| HTTP_ACCEPT_ENCODING | gzip,deflate |
| HTTP_ACCEPT_LANGUAGE | en-us,en;q=0.5 |
| HTTP_CONNECTION | keep-alive |
| HTTP_COOKIE | 200 |
| HTTP_HOST | localhost |
| HTTP_IF_MODIFIED_SINCE | Wed, 01 Aug 2007 15:59:49 GMT |
| HTTP_KEEP_ALIVE | 300 |
| HTTP_USER_AGENT | Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.5) Gecko/20060601 Firefox/2.0.0.5 (Ubuntu-edgy) |
If you reload the page within the next 60 seconds, the server will not send a new response, and you will see the same page instead of a newly generated page. The easiest way to tell is that the Date and HTTP_IF_MODIFIED_SINCE will not change when you reload.
One minute after you load the page, it will expire from the cache, and a subsequent request will load it again, setting a new expiry time in the cache.