Most
browsers cache (or store internally) the documents you access. This
is a very positive feature that saves a lot of resources; the browser
doesn't have to retrieve the document every time you look at it.
However, it can be a slight problem when you are dealing with virtual
documents created by CGI programs. Once the browser accesses a virtual
document produced by a CGI program, it will cache it. The next time
you try to access the same document, the browser will not make a
request to the server, but will reload the document from its cache.
To see the effects of caching, try running the following program:
#!/usr/local/bin/perl
chop ($current_date = `/bin/date`);
$script_name = $ENV{'SCRIPT_NAME'};
print "Content-type: text/html", "\n\n";
print "<HTML>", "\n";
print "<HEAD><TITLE>Effects of Browser Caching</TITLE></HEAD>", "\n";
print "<BODY><H1>", $current_date, "</H1>", "\n";
print "<P>", qq|<A HREF="$script_name">Click here to run again!</A>|, "\n";
print "</BODY></HTML>", "\n";
exit (0);
This program displays the current time, as well as a hypertext
link to itself. If you click on the link to run the program again,
the date and time that is displayed should change, but it does not,
because the browser is retrieving the cached document. You need
to explicitly tell the browser to reload the document if you want
to run the CGI program again.
Fortunately, there is a solution to this problem. If you don't
want a virtual document to be cached, you can use the Expires
and/or Pragma headers to instruct the client
not to cache the document.
#!/usr/local/bin/perl
print "Content-type: text/html", "\n";
print "Pragma: no-cache", "\n\n";
.
.
.
or
#!/usr/local/bin/perl
print "Content-type: text/html", "\n";
print "Expires: Wednesday, 27-Dec-95 05:29:10 GMT", "\n\n";
.
.
.
However, some browsers don't handle these headers correctly,
so don't rely on them.