So vermeiden Sie das AJAX-Caching in Internet Explorer 11, wenn zusätzliche Abfragezeichenfolgenparameter oder die Verwendung von POST keine Option sind

73

Mir ist klar, dass diese Frage gestellt wurde, aber in der modernen REST-Praxis sind weder die vorherigen Iterationen dieser Frage noch ihre Antworten korrekt oder ausreichend. Eine endgültige Antwort auf diese Frage ist erforderlich.

Das Problem ist bekannt, IE (sogar 11) speichert AJAX-Anfragen zwischen, was wirklich sehr, sehr dumm ist. Jeder versteht das.

Was nicht gut verstanden wird, ist, dass keine der vorherigen Antworten ausreichend ist. Jede vorherige Instanz dieser Frage zu SO wird als ausreichend beantwortet gekennzeichnet durch:

1) Verwenden eines eindeutigen Abfragezeichenfolgenparameters (z. B. eines Unix-Zeitstempels) für jede Anforderung, um jede Anforderungs-URL eindeutig zu machen und so das Caching zu verhindern.

-- oder --

2) Verwenden von POST anstelle von GET, da der IE POST-Anforderungen nur unter bestimmten Umständen zwischenspeichert.

-- oder --

3) Verwenden von "Cache-Control" -Headern, die vom Server übergeben werden.

IMO ist in vielen Situationen, in denen moderne REST-API-Verfahren angewendet werden, keine dieser Antworten ausreichend oder praktisch. Eine REST-API verfügt über völlig unterschiedliche Handler für POST- und GET-Anforderungen mit völlig unterschiedlichem Verhalten. Daher ist POST normalerweise keine geeignete oder korrekte Alternative zu GET. Außerdem sind viele APIs streng validiert und generieren aus zahlreichen Gründen 500 oder 400 Fehler, wenn sie nicht erwartete Parameter für Abfragezeichenfolgen eingeben. Schließlich stellen wir häufig eine Schnittstelle zu REST-APIs von Drittanbietern oder auf andere Weise her, bei denen wir keine Kontrolle über die von der Serverantwort bereitgestellten Header haben und das Hinzufügen von Cache-Steuerungsheadern nicht in unserer Macht steht.

Die Frage ist also:

Gibt es in dieser Situation wirklich nichts, was auf der Clientseite getan werden kann, um zu verhindern, dass der IE die Ergebnisse einer AJAX GET-Anforderung zwischenspeichert?

Stolli
quelle
3
Meinen Sie mit Best Practice eine Lösung? Die "beste Vorgehensweise" besteht wahrscheinlich darin, eines der Dinge zu verwenden, von denen Sie ausdrücklich bemerkt haben, dass Sie sie nicht verwenden möchten.
Kevin B
1
Wenn der IE die Cache-Steuerungsheader ignoriert, können Sie nur das verwenden, was Sie aufgelistet haben.
Kevin B
1
Um klar zu sein, zwischenspeichern auch andere Browser Ajax-Anfragen, nicht nur den IE.
Kevin B
1
Kevin B was? Ich habe dieses Verhalten noch nie in einem anderen (häufig verwendeten) Browser gesehen
Stolli
1
Der Unterschied besteht darin, dass der IE es zwischenspeichert, es sei denn, Sie sagen es nicht, und in einigen Fällen sogar dann.
Kevin B

Antworten:

60

Das Caching wird normalerweise durch Festlegen von Headern für den Inhalt gesteuert, wenn dieser vom Server zurückgegeben wird. Wenn Sie dies bereits tun und der Internet Explorer sie ignoriert und trotzdem zwischenspeichert, besteht die einzige Möglichkeit, dies zu umgehen, darin, eine der in Ihrer Frage genannten Cache-Busting-Techniken zu verwenden. Im Fall einer API ist es wahrscheinlich besser, sicherzustellen, dass Sie die richtigen Cache-Header verwenden, bevor Sie eine der Cache-Busting-Techniken ausprobieren.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ

Cache-control: no-cache
Cache-control: no-store
Pragma: no-cache
Expires: 0
Kevin B.
quelle
Schätzen Sie den ehrlichen Versuch einer Antwort, aber ich befürchte, dies lässt uns im Gebiet der "doppelten Frage / Antwort" zurück. Naja. Ich wette, diese Frage wird abgelehnt, ich werde sie löschen und mein "Gruppenzwang" -Abzeichen sammeln;).
Stolli
Gemäß Ihrer Frage erwähnen Sie "moderne REST-API". Ich stimme zwar zu, dass die Verwendung des "falschen" http-Verbs oder eines nutzlosen Parameters hackige Lösungen sind und für saubere und nette Implementierungen nicht funktionieren sollten, aber die tatsächlich entworfene (daher bevorzugte) Methode zum Festlegen von Cache-Steuerelementen ist serverseitig mit dem HTTP In dieser Antwort erwähnte Überschriften.
Alex Mazzariol
3
@stolli so viel zu diesem Gruppenzwang.
Kevin B
1

Wenn Sie die API nicht steuern, können Sie möglicherweise das IE-Caching deaktivieren, indem Sie Anforderungsheader zu den Ajax-Abrufen hinzufügen:

'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0'
Mark M.
quelle