Rolf Rost: Cachen von Images verhindern

Hallo liebe Forumer,

hab ein CGI Script das hat im Wesentlichen 2 Funktionen, die nacheinander ablaufen:

1. erstellt ein paar images
2. schickt html zum Browser wo die gerade erstellten png's als imgsrc eingebunden sind

Die Images haben, auch wenn sie neu erstellt wurden, denselben Namen und es ist i.d.R. auch dieselbe Anzahl von Images.

P: Die HTML-Seite ist zwar neu, aber die Images werden gecached.
Q: Wie kann ich das verhindern ?
Cachen verhindern sowohl auf UA, als auch auf Proxies (CacheServer).

Gruss, Rolf

--
KnowHow veröffentlichen statt patentieren!
  1. Hello,

    Die Images haben, auch wenn sie neu erstellt wurden, denselben Namen und es ist i.d.R. auch dieselbe Anzahl von Images.

    Q: Wie kann ich das verhindern ?
    Cachen verhindern sowohl auf UA, als auch auf Proxies (CacheServer).

    Werden die Images per Script erstellt?
    Dann solltest Du auch einen last modified header mitsenden.

    Dann würde ein "normaler Browser" beid er passenden Einstellung beim nächsten Zugriff auch ddas last_modified mit dem request mitsenden. Dein Script muss dann  natürlich darauf reagieren und ggf. mit "not modified" antworten...

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hello Tom,

      Werden die Images per Script erstellt?

      Jo. Mit RRDs::graph ...

      Dann solltest Du auch einen last modified header mitsenden.

      Bringt nix. Es werden ja die Grafiken gekäschd. Nicht gekäschd würden Grafiken, die vom Namen her neu sind. Ich könnte ja nun hergehen und die Grafiken jedesmal mit einem neuen Namen erstellen, aber da habe ich wieder das Problem, dass mir das Verzeichnis zumüllt mit png's...

      Bis morgen, Rolf

      --
      KnowHow veröffentlichen statt patentieren!
      1. Hello,

        Werden die Images per Script erstellt?
        Jo. Mit RRDs::graph ...

        Dann solltest Du auch einen last modified header mitsenden.
        Bringt nix. Es werden ja die Grafiken gekäschd. Nicht gekäschd würden Grafiken, die vom Namen her neu sind. Ich könnte ja nun hergehen und die Grafiken jedesmal mit einem neuen Namen erstellen, aber da habe ich wieder das Problem, dass mir das Verzeichnis zumüllt mit png's...

        Wird denn da auch ein HTTP-Header zum Thema modified mit gesendet? Woher soll der Browser sonst wissen, dass er neu nachfragen soll...

        hier mal ein Ausschnitt aus meinem PHP-Script zur Bildauslieferung...

        $last_modified = @gmdate('D, d M Y H:i:s',@filemtime(PICPATH.$filename)).' GMT';

        if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
          {
            // parse header
            $if_modified_since = preg_replace('/;.*$/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE']);

        if ($if_modified_since == $last_modified)
            {
              // the browser's cache is still up to date
              header("HTTP/1.0 304 Not Modified");
              header("Cache-Control: max-age=86400, must-revalidate");
              return true;
            }
          }

        Das funktioniert so ganz gut.

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hello Tom,

          Werden die Images per Script erstellt?
          Jo. Mit RRDs::graph ...

          Dann solltest Du auch einen last modified header mitsenden.
          Bringt nix. Es werden ja die Grafiken gekäschd. Nicht gekäschd würden Grafiken, die vom Namen her neu sind. Ich könnte ja nun hergehen und die Grafiken jedesmal mit einem neuen Namen erstellen, aber da habe ich wieder das Problem, dass mir das Verzeichnis zumüllt mit png's...

          [...]

          Dank Dir nochmal für Deine Bemühungen!
          Gestern am späten Abend ist mir eine Lösung eingefallen: Wenn die png neu erstellt werden muss (rrd-File hat sich geändert oder png ist noch nicht vorhanden) wird die alte png (falls vorhanden) gelöscht und eine neue mit einem neuen Namen (enthält einfach den timestamp im Namen), somit gibt es eine komplett neue HTML-Datei die das cgi zum Browser schickt.

          Wer weiß, wie sich alle Browser und vor allem die User verhalten... eliminiere ErrorCode 99, sischr is sischr ;-)

          Gruss, Rolf

        2. Hello again,

          Wird denn da auch ein HTTP-Header zum Thema modified mit gesendet? Woher soll der Browser sonst wissen, dass er neu nachfragen soll...

          Jo, mach ich nun auch: Verändere den URI ;-)

          http://perlbase.xwolf.de/cgi-bin/perlbase.cgi?display=10&id=24

          Gruss, Rolf

          --
          KnowHow veröffentlichen statt patentieren!