Aloha ;)
Ich meine dass beide Header zusammen keinen Sinn ergeben, weil allein max-age=0 den Browser anweist, die Seite bei jedem Request neu vom Server anzufordern anstatt sie zu cachen.
NEIN! Eben nicht.
Schauen wir kurz nach RFC 7234:
„The "max-age" response directive indicates that the response is to be considered stale after its age is greater than the specified number of seconds.“
Wenn wir in einem Nachschlagwerk unserer Wahl schauen was „stale“ bedeutet, so sehen wir, dass das einfach nur soviel wie „nicht mehr frisch“ bedeutet.
Ein gecachetes Dokument kann also offenbar zwei Stadien haben:
- fresh: Der Browser kann das gecachete Dokument bedenkenlos verwenden, weil es noch frisch und weiterhin "haltbar" ist
- stale: Das Mindesthaltbarkeitsdatum des gecacheten Dokuments ist abgelaufen. Es gilt als nicht mehr frisch, kann aber noch genießbar sein.
Lass mich dir das Konzept mit einem kleinen Bild näher bringen.
Stell dir mal vor, dass du auf einem Bauernhof in Hinter-Turkmenistan lebst und der nächste Laden ist 50km entfernt. Du möchtest unbedingt einen Wackelpudding essen. Also gehst du zu deinem mit Windkraft betriebenen Kühlschrank und wirfst einen Blick auf deinen Wackelpudding-Vorrat.
Du siehst auf dem ersten Wackelpudding, dass sein Mindesthaltbarkeitsdatum noch nicht erreicht ist. Also isst du ihn. Du denkst nicht mal dran, dir stattdessen einen neuen zu kaufen.
Dann möchtest du unbedingt nochmal einen Wackelpudding essen. Leider warst du beim Einräumen nach dem letzten Einkauf nicht so schlau, die neuen Wackelpuddings nach hinten zu räumen. Also hast du leider jetzt nur noch alte Wackelpuddings, die abgelaufen sind.
Du stehst jetzt vor der folgenden Wahl: Entweder, du isst den abgelaufenen Wackelpudding und wirst vielleicht krank davon (ich würde in Hinter-Turkmenistan nichts Abgelaufenes essen wollen, wenns auch anders geht). Oder du kaufst dir einen neuen. Und wenn du klug bist, dann wirst du nicht 50km auf dem Rücken deines Esels zum nächsten Laden reiten, um dir einen Wackelpudding zu kaufen, wenn du nicht vorher weißt, ob die überhaupt frischen Wackelpudding haben. Also wirst du wohl, wenn du klug bist, vorher mal in dem Laden anrufen und nachfragen, bevor du dich auf den Weg machst.
Die Reihenfolge bei abgelaufenem Wackelpudding ist also die:
Anruf im Laden. Habt ihr frischen Wackelpudding?
Fall 1: JA! - Du reitest 50km auf deinem Esel, kaufst frischen Wackelpudding, und isst diesen dann.
Fall 2: NEIN! - Natürlich reitest du jetzt nicht 50km weit, nur um anderen abgelaufenen Wackelpudding zu bekommen. Du isst einfach deinen eigenen abgelaufenen Wackelpudding, weil es ja auch keinen frischeren gibt. Irgendwas muss man ja essen. (Ja, der Wackelpudding ist das einzige was wir haben und nein, der Esel wird nicht gegessen, der ist in Hinter-Turkmenistan heilig!)
So machen das normale Browser mit ihrem Cache auch. Gilt der gecachete Inhalt als frisch, so wird er dem Nutzer direkt serviert. Gilt er nicht mehr als frisch, dann wird erst mal der Server angefunkt, ob es überhaupt frischen gibt, und wenn ja, wird frischer ausgeliefert, und falls nein, dann gibts eben doch den alten Inhalt aus dem Cache, der dabei eventuell sogar nen neuen Haltbarkeits-Stempel bekommt.
In dem eben diskutierten Bild ist max-age=0
das gleiche wie "Haltbarkeitsdatum: jetzt". Und must-revalidate
entspricht dann einem Aufdruck wie „Verwenden Sie dieses Produkt sofort und aus ihrem Lager nur dann, wenn es beim Laden Ihres Vertrauens kein frisches gibt.“
In beiden Fällen wird ein vernünftiger Browser beim Laden des Vertrauens anrufen und erfragen, ob es frische Ware gibt.
Caching wird dadurch also keineswegs verhindert, es wird nur verhindert, dass der Browser den gelagerten Inhalt verwendet ohne erst beim Server nachzufragen!
Von daher wird der Browser auch kein if-modified-since senden, ganz einfach deswgen nicht, weil er die Seite gar nicht im Cache hat.
Was du da eben postulierst, ist, dass du als Browser folgendes tätest:
Du willst in Hinter-Turkmenistan (ich will jetzt nicht das ganze Bild nochmal zitieren, es sollte klar sein) einen Wackelpudding essen, dann gehst du an den Kühlschrank und wenn da nur noch abgelaufener Wackelpudding drin ist, dann wirfst du den erstmal weg. Anschließend setzt du dich auf deinen Esel, reitest 50km zum nächsten Laden. Dieser hat leider auch nur denselben abgelaufenen Wackelpudding, den du eben zuhause weggeworfen hast (zum Beispiel, weil der letzte Versorgungs-LKW leider von einer Schafherde auf der Straße blockiert wurde). Also, weil du Wackelpudding essen willst, musst du den abgelaufenen Wackelpudding kaufen, und dann zuhause Stunden später doch abgelaufenen Wackelpudding essen.
Bitte sag mir jetzt, dass du verstehst, dass man als Browser einen Cache, der stale ist oder überprüft werden muss, eben nicht wegwirft, sondern dann am Server anfragt, ob es frischen gibt, und im Fall eines Nein dann doch den Cache verwendet!
Nimm dies bitte als Antwort auf Deine Polemik.
Ich hatte gehofft die Polemik würde dir die Scheuklappen öffnen. Hat aber nicht geholfen. Wenns der Wackelpudding aus Hinter-Turkmenistan auch nicht tut, dann weiß ich auch nicht mehr weiter.
Grüße,
RIDER
--
Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
#
Twitter #
Steam #
YouTube #
Self-Wiki #
Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[