Alexander Foken: Caching

Beitrag lesen

Moin Moin !

telnet webserver 80

Trying 10.1.128.167...
Connected to webserver.
Escape character is '^]'.
GET /cgi-bin/mycgi.pl HTTP/1.0

HTTP/1.1 200 OK
Date: Tue, 03 Sep 2002 17:50:11 GMT
Server: Apache/1.3.22 (Win32)
Expires: Mon, 02 Sep 2002 17:50:15 GMT
Pragma: nocache
Connection: close
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
[...]

Oder in Perl:

use CGI qw(header);
print header({-expires=>'-1d',-pragma=>'nocache'});

Das funktioniert hervorragend mit den verschiedensten Browsern (getestet mit IE ab 4, NN ab 4.0x, Opera ab 3.x, Mozilla).

Wie es geht: Erstmal sag ich mit pragma=>nocache, das der Browser diesen Request besser nicht in den Cache packt. Dann sorge ich mit expires=>-1d noch dafür, daß die Seite vor 24 Stunden veraltet ist. "Cache-Control: no-cache" oder so könnte man auch noch einbauen.

Ansonsten müßtest Du deine HTML-Seiten dynamisch auf dem Server erzeugen, und dafür sorgen, daß in dem IMG-Tag immer ein Teil der URL veränderlich ist. Das kann der Browser dann nicht mehr cachen.

Mit SSI (und Apache) müßte das ungefähr so gehen:

<!--#config timefmt="%s" --><!-- Sekunden seit der Epoche -->
<IMG SRC="/cgi-bin/statistik.cgi/<!--#echo encoding="url" var="DATE_GMT" -->/<!--#echo encoding="url" var="REMOTE_ADDR" -->" ALT="Just a counter">

Das CGI bekommt als PATH_INFO die Aufrufzeit der SSI-Seite und die Remote IP-Adresse, getrennt durch Slashes. Die Aufrufzeit ist nützlich, um die Ladezeiten abzuschätzen, die IP-Adresse zum Verfolgen der User. Eine Zufallszahl wäre noch ganz nett, aber dafür braucht man bei SSI externe Prozesse, die in der Performance recht teuer sind. Ansatz: <!--#exec cmd="/usr/local/bin/perl -e 'print rand'" --> oder <!--#include virtual="/cgi-bin/internal/random" -->

Alexander