Ist da irgendwo eine Fehlkonfiguration? Ist das ein Bug? Oder ist das tatsächlich die Mentalität der IE-Entwickler? Ich kann’s eigentlich kaum glauben, wie man etwas so Fundamentales so fundamental verkacken kann. Ich hab schon von Workarounds gelesen à la ›immer negatives Expiration-Datum mitgeben‹. Muss ich jetzt noch OVER 9000 weitere Header-Zeilen (gibt ja auch noch ETags und Caching-Direktiven) mitgeben, nur damit der IE annähernd wie ein Browser funktioniert?
Das ist komplett legitimes Verhalten. Solange du nicht "Cache-Control: no-cache" o.ä. ähnliche Header gesetzt hast, darf der Browser gecachte Requests ohne Revalidierung aus dem Cache präsentieren.
Das Google Stichwort hier ist Freshness & Stale Responses, das HTTP RFC hat da mehr Informationen. Grundsätzlich gilt, dass wenn du keine Cache-Control-Header angibst, dass der Browser dann Heuristiken anwenden darf um zu bestimmen ob ne Seite Stale ist oder nicht. Solange eine Seite nicht Stale ist, muss der Browser auch nicht mit If-Modified-Since o.ä. revalidieren.
Wäre auch ziemlich dämlich jedes Mal 100ms Latenz mit Revalidierung zu verschwenden, nur um es dann trotzdem aus dem Cache anzuzeigen. Der Zeitverschwender ist ja heutzutage die Latenz, nicht die Bandbreite.
Caching ist ein unheimlich komplexes Problem. Der HTTP-Caching-Standard ist ziemlich genial in der Hinsicht, aber er funktioniert halt anders als die meisten das erwarten. Ich hatte bisher leider auch nie die Zeit und Musse mich da wirklich einzulesen, so dass ich keine direkte Empfehlung aussprechen könnte. Spontan glaube ich aber, dass du entweder must-revalidate mit max-age oder gleich no-cache haben willst.
Nachtrag: Nach etwas durchscrollen glaube ich schon, dass hier ne Heuristik anschlägt.
If the response has a Last-Modified header field (Section 2.2 of
[RFC7232]), caches are encouraged to use a heuristic expiration value
that is no more than some fraction of the interval since that time.
A typical setting of this fraction might be 10%.
Wenn dir das nicht passt, musst du eine explizite Freshness-Angabe machen, mit Cache-Control max-age oder Expires.