Butch: Cache-Probleme, Header

Mit diesem Problem beschäftige ich mich schon seit Tagen:

Android-Browser sind offensichtlich extrem cache-lastig, sie laden sehr ungern vom Server, was bei mir zu argen Problemen führt.

Ich habe es mit den üblichen HTML-Tricks versucht, etwa:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
      <meta http-equiv="pragma" content="no-cache">
      <meta http-equiv="expires" content="-1">

und mit diversesten, mühsam entwickelten "Dirty"-Tricks ... ohne Erfolg. In manchen Fällen dauert es bis zu einem Tag, bis der Browser an einem Smartphone sich bequemt, vom Server zu laden!

Jetzt habe ich aufgrund eines Tipps das Ganze auf php umgestellt. In den betreffenden Dateien habe ich am Anfang diesen php-Code:

<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>

Und siehe da, das scheint zu funktionieren.

Jetzt zu meiner konkreten Frage ... weil ich an sich von dem ganzen Zeug kaum was verstehe und für meinen Zweck php sehr lästig ist:

Gibt es eigentlich einen Unterschied zwischen php-Headern und den entsprechenden html-Codes, oder ist die Wirkung vollständig ident? Anders gefragt: Ist die Wirkung von html-Codes ABSOLUT die gleiche wie die von php-Headers?

In diesem Fall würde ich mir die Mühe machen und es noch einmal ohne php versuchen.

Wie würden ggf. die html-Zeilen lauten, die dem obigen php-Code entsprechen?

Vielen Dank im Voraus!

  1. hi,

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

    also, wenn Du diesen header sendest, dann wird auf diese Art und Weise gecached. Bedenke, dass es mehrere Verfahren zum Cachen gibt. Das Verfahren per Last-Modified ist das älteste Verfahren.

    Gibt es eigentlich einen Unterschied zwischen php-Headern und den entsprechenden html-Codes, oder ist die Wirkung vollständig ident? Anders gefragt: Ist die Wirkung von html-Codes ABSOLUT die gleiche wie die von php-Headers?

    HTTP-Header sind vorrangig. Wenns die nicht gibt, versucht der Browser anhand Meta-Tags herauszufinden, was er machen soll.

    Wenn Du Cachen verhindern willst:
            'Cache-Control' => 'no-cache, must-revalidate, proxy-revalidate',
            'Expires' => 'Thu, 28 Nov 2013 01:01:01 GMT',

    (expires in die Vergangenheit legen)
    Etag:
    FileETag None
    (in .htaccess)

    Und guck Dir das mit den richtigen Werkzeugen an.

    Horst

    --
    Ich biete: Softwarelösungen für Mobile Datenerfassung mit Tablet, Smartphone o.a. mobilen Endgeräten
    1. hi,

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

      also, wenn Du diesen header sendest, dann wird auf diese Art und Weise gecached. Bedenke, dass es mehrere Verfahren zum Cachen gibt. Das Verfahren per Last-Modified ist das älteste Verfahren.
      ...

      Hallo Horst!

      Du überforderst mich leider ...

      Ich weiß, dass in meinem php-Code absichtlich verschiedene Methoden zusammengefasst sind, die möglichst viele Browser abdecken sollten.

      Könntest du mir vielleicht so antworten, dass ich es mit meinen geringen Kenntnissen verstehe? Meine Frage ist konkret:
      a) Wenn ich das Gleiche mit HTML mache, ist die Wirkung dann prinzipiell dieselbe, oder ist es so, dass php anders (ggf. zuverlässiger) wirkt?
      b) Wie würde die "Übersetzung" der php-Zeilen in html lauten?

      Butch

      1. Mahlzeit,

        a) Wenn ich das Gleiche mit HTML mache, ist die Wirkung dann prinzipiell dieselbe, oder ist es so, dass php anders (ggf. zuverlässiger) wirkt?

        Wenn das HTML geladen wird, müssen die Header schon da sein, es geht also nicht in HTML.

        b) Wie würde die "Übersetzung" der php-Zeilen in html lauten?

        s.o., also gar nicht ;)

        --
        42
        1. Mahlzeit,

          a) Wenn ich das Gleiche mit HTML mache, ist die Wirkung dann prinzipiell dieselbe, oder ist es so, dass php anders (ggf. zuverlässiger) wirkt?

          Wenn das HTML geladen wird, müssen die Header schon da sein, es geht also nicht in HTML.

          b) Wie würde die "Übersetzung" der php-Zeilen in html lauten?

          s.o., also gar nicht ;)

          Der Effekt auf das Cache-Verhalten des Browsers ist also bei den folgenden zwei Alternativen (als Beispiel) unterschiedlich?

          A)

          <?php
          header("Cache-Control: no-store, no-cache, must-revalidate");
          ?>
          <html>
            <head>
            ...
            <body>

          B)

          <html>
            <head>
            ...
            <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
            ...
            <Body>

          1. Mahlzeit,

            Der Effekt auf das Cache-Verhalten des Browsers ist also bei den folgenden zwei Alternativen (als Beispiel) unterschiedlich?

            Ja. A hat vorrang.

            --
            42
            1. Mahlzeit,

              Der Effekt auf das Cache-Verhalten des Browsers ist also bei den folgenden zwei Alternativen (als Beispiel) unterschiedlich?

              Ja. A hat vorrang.

              Also, irgendwie klappt das hier mit klaren Antworten nicht ... A hat Vorrang??? Ich versuche es noch einmal:

              Kann es sein, dass bei einem Browser die php-Methode A) das Laden vom Cache verhindert und die html-Methode B) nicht? Oder ist es so, dass beide Methoden das Gleiche erreichen, sofern der Browser überhaupt empfänglich ist für den verwendeten Befehl?

              B.

              1. Mahlzeit,

                Also, irgendwie klappt das hier mit klaren Antworten nicht ... A hat Vorrang???

                Das liegt nicht an der Antwort sondern an deinem Verständnis.
                Wenn A vorrang hat, wird es, falls vorhanden, bevorzugt vom Browser beachtet, somit B ignoriert.

                --
                42
                1. Mahlzeit,

                  Also, irgendwie klappt das hier mit klaren Antworten nicht ... A hat Vorrang???

                  Das liegt nicht an der Antwort sondern an deinem Verständnis.
                  Wenn A vorrang hat, wird es, falls vorhanden, bevorzugt vom Browser beachtet, somit B ignoriert.

                  Du liebe Güte! Ich will nicht wissen, was Vorrang hat oder was ignoriert wird, sondern bitte bitte nur das:
                  Wenn A) bei einem bestimmten Browser das Laden vom Cache verhindert, täte es dann auch die Alternative B)?

                  1. Moin!

                    Mahlzeit,

                    Also, irgendwie klappt das hier mit klaren Antworten nicht ... A hat Vorrang???

                    Das liegt nicht an der Antwort sondern an deinem Verständnis.
                    Wenn A vorrang hat, wird es, falls vorhanden, bevorzugt vom Browser beachtet, somit B ignoriert.

                    Du liebe Güte! Ich will nicht wissen, was Vorrang hat oder was ignoriert wird, sondern bitte bitte nur das:
                    Wenn A) bei einem bestimmten Browser das Laden vom Cache verhindert, täte es dann auch die Alternative B)?

                    Nein, vor allen dann nicht, wenn im HTTP andere Header drinstehen, als im HTML. Dann gewinnt immer HTTP. Mit PHP ersetzt du die vom Server standardmäßig gesetzten Header, mit HTML kannst du sie bestenfalls ergänzen (also nicht vorhandene Header setzen, aber nicht die vorhandenen ändern).

                    Hast du schon mal analysiert, welche Header bei HTML-Seiten von deinem Webserver gesendet werden?

                    - Sven Rautenberg

                    1. Nein, vor allen dann nicht, wenn im HTTP andere Header drinstehen, als im HTML. Dann gewinnt immer HTTP. Mit PHP ersetzt du die vom Server standardmäßig gesetzten Header, mit HTML kannst du sie bestenfalls ergänzen (also nicht vorhandene Header setzen, aber nicht die vorhandenen ändern).

                      Hast du schon mal analysiert, welche Header bei HTML-Seiten von deinem Webserver gesendet werden?

                      • Sven Rautenberg

                      Besten Dank, Sven, ein Tipp, von dem ich als Banause auch was lerne!!! Mir ist neu, dass die Server solche Sachen unterschiedlich machen, die man dann auch noch berücksichtigen muss. Das ist ja ein Chaos ... ;-)

                      In meinem Fall finde ich mit web-sniffer.net, dass der Server unter HTTP Request Header offensichtlich immer "Cache-Control: no-cache" sendet. Das würde also passen, ich muss da nichts mittels PHP ersetzen, nicht war?

                      Worauf läuft das aber jetzt hinaus in Bezug auf meine Frage? Erreiche ich bei einem jeweils bestimmten Browser mit der meta-Methode

                      <meta http-equiv="Expires" content="Mon, 26 Jul 1997 05:00:00 GMT">
                      <meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate">
                      <meta http-equiv="Cache-Control" content="post-check=0, pre-check=0, false">
                      <meta http-equiv="Pragma" content="no-cache">

                      dann grundsätzlich das Gleiche wie mit der php-Methode

                      <?php
                      header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
                      header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
                      header("Cache-Control: no-store, no-cache, must-revalidate");
                      header("Cache-Control: post-check=0, pre-check=0", false);
                      header("Pragma: no-cache");
                      ?>

                      oder hängt das wieder von anderen Faktoren ab?

                      (Hab noch nicht herausgefunden, wie die 2. header-Zeile in meta-Zeile zu "übersetzen" ist ...)

                      1. Hallo

                        Hast du schon mal analysiert, welche Header bei HTML-Seiten von deinem Webserver gesendet werden?

                        In meinem Fall finde ich mit web-sniffer.net, dass der Server unter HTTP Request Header offensichtlich immer "Cache-Control: no-cache" sendet. Das würde also passen, ich muss da nichts mittels PHP ersetzen, nicht war?

                        Wenn diese Angabe explizit vom Server kommt und nicht mittels PHP gesetzt wurde, nicht.

                        Worauf läuft das aber jetzt hinaus in Bezug auf meine Frage? Erreiche ich bei einem jeweils bestimmten Browser mit der meta-Methode

                        <meta http-equiv="Expires" content="Mon, 26 Jul 1997 05:00:00 GMT">
                        <meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate">
                        <meta http-equiv="Cache-Control" content="post-check=0, pre-check=0, false">
                        <meta http-equiv="Pragma" content="no-cache">

                        dann grundsätzlich das Gleiche wie mit der php-Methode

                        <?php
                        header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
                        header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
                        header("Cache-Control: no-store, no-cache, must-revalidate");
                        header("Cache-Control: post-check=0, pre-check=0", false);
                        header("Pragma: no-cache");
                        ?>

                        Ja, wenn der Server die entsprechenden Header nicht setzt oder sowieso die gleichen Werte liefert; nein, wenn der Server die entsprechenden Header setzt und/oder sich die gelieferten Werte von den in den HTML-Elementen unterscheidet.

                        Tschö, Auge

                        --
                        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
                        Terry Pratchett, "Wachen! Wachen!"
                        ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
                        Veranstaltungsdatenbank Vdb 0.3
                        1. Erreiche ich bei einem jeweils bestimmten Browser mit der meta-Methode
                          ...
                          dann grundsätzlich das Gleiche wie mit der php-Methode

                          Ja, wenn der Server die entsprechenden Header nicht setzt oder sowieso die gleichen Werte liefert; nein, wenn der Server die entsprechenden Header setzt und/oder sich die gelieferten Werte von den in den HTML-Elementen unterscheidet.

                          Tschö, Auge

                          Das wollte ich an sich hören. Jetzt sagt aber blöderweise jemand Folgendes:

                          "Das Problem ist, dass sich Proxys nicht um den HTML Header kümmern. Die würden trotzdem cachen. Da bleiben nur HTTP-Header, diese lesen auch die Proxys."

                          Also doch nicht????

                          1. Hallo,

                            Erreiche ich bei einem jeweils bestimmten Browser mit der meta-Methode
                            ...
                            dann grundsätzlich das Gleiche wie mit der php-Methode
                            Ja, wenn der Server die entsprechenden Header nicht setzt oder sowieso die gleichen Werte liefert; nein, wenn der Server die entsprechenden Header setzt und/oder sich die gelieferten Werte von den in den HTML-Elementen unterscheidet.

                            klingt kompliziert, scheint aber zu stimmen.

                            "Das Problem ist, dass sich Proxys nicht um den HTML Header kümmern. Die würden trotzdem cachen. Da bleiben nur HTTP-Header, diese lesen auch die Proxys."
                            Also doch nicht????

                            Ein Proxy ist kein Browser. Ein Proxy interpretiert kein HTML, er reicht Daten nur unbesehen durch (und darf sie ggf. cachen). Aber das passt doch zum Tenor, dass die meta-Angaben nur in der zweiten Liga spielen - sie werden von (den meisten) Browsern interpretiert und können Angaben ergänzen, die nicht per HTTP-Header übermittelt wurden.

                            So long,
                             Martin

                            --
                            Frauen sind wie Elektrizität: Fasst man sie an, kriegt man eine gewischt.
                            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                      2. હેલો

                        Worauf läuft das aber jetzt hinaus in Bezug auf meine Frage? Erreiche ich bei einem jeweils bestimmten Browser mit der meta-Methode

                        <meta http-equiv="Expires" content="Mon, 26 Jul 1997 05:00:00 GMT">
                        <meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate">
                        <meta http-equiv="Cache-Control" content="post-check=0, pre-check=0, false">
                        <meta http-equiv="Pragma" content="no-cache">

                        dann grundsätzlich das Gleiche wie mit der php-Methode

                        <?php
                        header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
                        header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
                        header("Cache-Control: no-store, no-cache, must-revalidate");
                        header("Cache-Control: post-check=0, pre-check=0", false);
                        header("Pragma: no-cache");
                        ?>

                        oder hängt das wieder von anderen Faktoren ab?

                        Letztere haben vorrang. Sprich, wenn sich die Header in PHP von denen im HTML unterscheiden, hat PHP vorrang. So auch dein Webserver. Wenn der was anderes schickt, als das, was du in deinem HTML schreibst, dann haben die header des Servers vorrang. Die Meta-Angaben im HTML sind als Ergänzung gedacht, für bspw. Bots. Die header einer Seite sind bereits 3 mal um die Welt, bevor sich das HTML die Schuhe anzieht.

                        બાય

                        --
                         .
                        ..:
                        1. Hallo,

                          Die Meta-Angaben im HTML sind als Ergänzung gedacht, für bspw. Bots.

                          nein, Bots sind auch nur gewöhnliche HTTP-Clients. Auch für die haben die HTTP-Header Vorrang vor möglicherweise anderslautenden meta-Angaben im Dokument mit gleichem Key. Ergänzung ist schon richtig - aber nicht (nur) für Bots, sondern für alle Clients, falls der Server bestimmte Angaben nicht im HTTP-Header mitliefert oder das Dokument mal auf anderem Weg als HTTP übermittelt wird.

                          Ciao,
                           Martin

                          --
                          Most experts agree: Any feature of a program that you can't turn off if you want to, is a bug.
                          Except with Microsoft, where it is just the other way round.
                          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      2. Du überforderst mich leider ...

        Im Moment vielleicht ;)

        Nimm Dir mehr Zeit für solche Sachen.

        Auf jeden Fall: Lass den Last-Modified-Header grundsätzlich weg, wenn nicht gecacht werden soll. Guck mit Firebug, LiveHTTPHeaders o.a. ob Dein Webserver einen Etag-Header erzeugt und unterbinde das ggf.
        Setze Expires auf eine Datum in der Vergangenheit. Setze den Header

        Cache-Control' => 'no-cache, must-revalidate, proxy-revalidate',

        a) Wenn ich das Gleiche mit HTML mache, ist die Wirkung dann prinzipiell dieselbe, oder ist

        es so, dass php anders (ggf. zuverlässiger) wirkt?

        Wenn die Seite von einem Webserver ausgeliefert wird (http://example.org), isses dem Browser völlig Wurscht, was in HTML steht.

        Guck Dir an, wie der Webserver konfiguriert ist, welche Header tatsächlich gesendet werden und ob der das macht, was er soll.

        b) Wie würde die "Übersetzung" der php-Zeilen in html lauten?

        Siehe a)

        Horst Henneberger

  2. હેલો

    Android-Browser sind offensichtlich extrem cache-lastig, sie laden sehr ungern vom Server, was bei mir zu argen Problemen führt.

    Das ist doch gut. Die meisten Smartphones haben, obwohl wir bereits im 21. Jahrhundert leben, nur begrenztes Internet.

    Ich habe es mit den üblichen HTML-Tricks versucht, etwa:

    Arbeitest du mit HTML-Dateien? Wenn sich in einer HTML-Datei etwas ändert, werden die Last-Modified-Header automatisch erneuert. Das heisst, wenn sich in deiner HTML-Datei nichts tut, gibt es für den Browser keinen Grund, die Ressource vom Server neu anzufordern. Wenn sich was ändert, sollte das Dokument vom Server neu geladen werden, ohne dein zutun.

    und mit diversesten, mühsam entwickelten "Dirty"-Tricks ...

    Ist die Seite Online, können wir uns das irgendwo anschauen?

    બાય

    --
     .
    ..:
  3. hi,

    Ich habe es mit den üblichen HTML-Tricks versucht, etwa:

    Es gibt neue Tricks, such mal nach manifest cache

    --