Alexander Gordt: Cache unterdücken?

Hi Leute!

Gibt es eine Möglichkeit, dem Browser zu sagen, daß er eine HTML-Seite bei jedem anzeigen neu lädt; oder anders ausgedrückt, wie unterdrücke ich den Cache vollkommen?
Ich möchte ein Gästebuch machen, doch wenn man auf aktualisieren geht, um sich den neuen Eintrag anzusehen, dann überträgt der Browser das Formular zum Eintragen nochmals.
Dadurch bekomme ich jeden Eintrag doppelt - das möchte ich verhindern. Ich muß also auch den Back-Button des Browsers so hinbekommen, dass die Seite neu geladen wird.

Viele Grüße,

Alex

  1. hi!

    Gibt es eine Möglichkeit, dem Browser zu sagen, daß er eine HTML-Seite bei jedem
    anzeigen neu lädt?

    Wenn auch nicht ganz standard-konform:
      <meta http-equiv="expires" content="0">
    Sollte wohl in den meisten Fällen funktionieren...

    bye, Frank!

    1. Hi,

      Wenn auch nicht ganz standard-konform:
        <meta http-equiv="expires" content="0">
      Sollte wohl in den meisten Fällen funktionieren...

      Leider setzt sich der IE über diese Angaben hinweg, und holt sich die Seiten aus dem Cache wenn man auf dem Zurückbutton klickt. Die einzige Möglichkeit, die bislang bei mir einwandfrei funktioniert hat, ist das User-Verhalten auf der Site mit Cookies zu verfolgen, und, falls erforderlich, ein Reload mit location.reload() zu erzwingen.

      Gruß,
      UlfL

  2. Moin Alex,

    das Problem hatte ich bis vor wenigen Stunden auch noch ;). Wenn du eine Scriptsprache wie Perl oder PHP nutzt, in der man einen HTTP-Header absenden kann, hab ich jetzt die Lösung für dich:

    Einfach ganz oben in der Datei folgendes schreiben (PHP):

    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
    header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
    header("Pragma: no-cache"); // HTTP/1.0

    Wichtig ist die Zeile mit last-modified. Ohne diese ignoriert MSIE das Expire-Datum geflissentlich.

    Gruss,
      David

    1. Hi Alexander,

      header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified

      kannst du vielleicht für ein Nicht-PHP'ler erläutern, wie der Last-Modified-String in Klartext aussieht? Ich beschäftige mich nähmlich mit der selben Problematik, aber mit serverseitigem Java, und mir ist es bislang nicht gelungen, den IE vom Cachen der Seiten abzuhalten.

      thx,
      UlfL

      1. header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified

        kannst du vielleicht für ein Nicht-PHP'ler erläutern, wie der Last-Modified-String in Klartext aussieht?

        Im Klartext hiesse es:

        Last-Modified: Mon, 20 Sep 1999 16:33:00

        Gruss,
          David

        1. Hi David,

          Im Klartext hiesse es:

          Last-Modified: Mon, 20 Sep 1999 16:33:00

          das bedeutet also, daß Last-Modified auf dem Augenblick zeigt, wo die Seite im Browser ankommt. Dann müßte man ihn doch auch gleich null setzen können, oder? Sprich:

          Last-Modified: 0

          Damit cacht aber mein IE5 die Seiten munter weiter, Netscape jedoch nicht. Ich habe den folgenden Java-Code in ein Servlet eingefügt:

          if(request.getProtocol().compareTo("HTTP/1.0")==0){
             response.setHeader("Pragma", "no-cache");
          } else if(request.getProtocol().compareTo("HTTP/1.1")==0){
             response.setHeader("Cache-Control", "no-cache, must-revalidate");
          }
          response.setDateHeader("Expires", -2000000);
          response.setDateHeader("Last-Modified", 0);

          Gruß,
          UlfL

          1. Hi Ulf!

            das bedeutet also, daß Last-Modified auf dem Augenblick zeigt, wo die Seite im Browser ankommt. Dann müßte man ihn doch auch gleich null setzen können, oder? Sprich:

            Last-Modified: 0

            Nein, hinter Last-Modified muss eine gueltiges HTTP-date stehen (siehe Section 10.10  "Last-Modified" in http://www.ietf.org/rfc/rfc1945.txt). Und das ist laut Section 3.3 in derselben Quelle. Mit
                Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
            bist Du auf der sicheren Seite. Da David geraten hat, *immer* ein Datum in der Vergangenheit zu senden, kannst Du ja ein festes codieren, falls Deine Programmiersprache keine eingebaute Funktion anbietet, um so einen String zu bauen.

            Damit cacht aber mein IE5 die Seiten munter weiter, Netscape jedoch nicht. Ich habe den folgenden Java-Code in ein Servlet eingefügt:

            Naja, der last-Modified -Header war "syntaktisch" einfach falsch, deshalb wurde er vermutlich ignoriert.

            Bye, Calocybe

            1. Hi Calocybe,

              Nein, hinter Last-Modified muss eine gueltiges HTTP-date stehen (siehe Section 10.10  "Last-Modified" in http://www.ietf.org/rfc/rfc1945.txt). Und das ist laut Section 3.3 in derselben Quelle. Mit
                  Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
              bist Du auf der sicheren Seite.

              Mit der unten aufgeführten Code werden die Seiten aber weiterhin gecacht. Da mein IE5 von der CeBIT kommt, frage ich mich langsam, ob ich da eine besonders HTTP-Header-resistente Variante erwischt habe...

              Gruß,
              UlfL

              ===========================

              response.setHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT");
              response.setHeader("Last-Modified", "Tue, 15 Nov 1994 12:45:26 GMT");
              response.setHeader("Pragma", "no-cache");
              response.setHeader("Cache-Control", "no-cache");

              1. Hi Ulf!

                Mit der unten aufgeführten Code werden die Seiten aber weiterhin gecacht. Da mein IE5 von der CeBIT kommt, frage ich mich langsam, ob ich da eine besonders HTTP-Header-resistente Variante erwischt habe...

                Ach so, haette ich vielleicht dazu sagen sollen, dass der IE5 ungefaehr soooo nen grossen Bug in seinem Cachesystem hat. Sonst wirkt der aber immer gerade andersherum, also Grafiken werden immer neu angefordert, obwohl sie laengst im Cache sein sollten. Deswegen funktioniert das Image-Preload-JS dort nicht. Schau einfach mal im Archiv danach. Und schau mal, ob andere Browser Deine Header korrekt interpretieren. Habe jetzt bei einem fluechtigen Blick auch nichts weiter verdaechtiges gefunden.

                Bye, Calocybe