web-dev-qa-db-fra.com

Comment éviter AJAX la mise en cache dans Internet Explorer 11 lorsque des paramètres de chaîne de requête supplémentaires ou l'utilisation de POST ne sont pas une option

Je me rends compte que cette question a été posée, mais dans la pratique REST moderne, aucune des itérations précédentes de cette question ni leurs réponses ne sont exactes ou suffisantes. Une réponse définitive à cette question est nécessaire.

Le problème est bien connu, IE (même 11) met en cache les requêtes AJAX, ce qui est vraiment stupide. Tout le monde comprend cela.

Ce qui est pas bien compris, c'est qu'aucune des réponses précédentes n'est suffisante. Chaque instance précédente de cette question sur SO est signalée comme ayant reçu une réponse suffisante de l'une des manières suivantes:

1) Utilisation d'un paramètre de chaîne de requête unique (tel qu'un horodatage Unix) sur chaque demande, afin de rendre chaque URL de demande unique, empêchant ainsi la mise en cache.

-- ou --

2) l’utilisation de POST à la place de GET, car IE ne met pas en cache les demandes POST sauf dans certaines circonstances uniques.

-- ou --

3) en utilisant les en-têtes 'cache-control' passés par le serveur.

IMO dans beaucoup situations impliquant la pratique moderne de l'API REST, aucune de ces réponses n'est suffisante ou pratique. Une API REST aura des gestionnaires complètement différents pour les requêtes POST et GET, avec un comportement complètement différent, de sorte que POST n'est généralement pas une alternative appropriée ou correcte à GET. En outre, de nombreuses API ont une validation stricte et généreront, pour de nombreuses raisons, 500 ou 400 erreurs lors de l’alimentation de paramètres de chaîne de requête inattendus. Enfin, nous nous connectons souvent avec des API REST tierces ou inflexibles sur lesquelles nous n'avons aucun contrôle sur les en-têtes fournis par la réponse du serveur, et l'ajout d'en-têtes de contrôle de cache n'est pas en notre pouvoir.

Donc, la question est:

N'y a-t-il vraiment rien qui puisse être fait du côté du client dans cette situation pour empêcher I.E. de mettre en cache les résultats d'une demande AJAX GET?

64
stolli

La mise en cache est normalement contrôlée via la définition d'en-têtes sur le contenu lorsqu'il est renvoyé par le serveur. Si vous le faites déjà et IE les ignore et met en cache de toute façon, la seule façon de le contourner serait d'utiliser l'une des techniques de suppression du cache mentionnées dans votre question. Dans le cas Dans le cas d’une API, il serait probablement préférable de vous assurer que vous utilisez les en-têtes de cache appropriés avant de tenter l’une des techniques de contournement du cache.

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

Cache-control: no-cache
Cache-control: no-store
Pragma: no-cache
Expires: 0
54
Kevin B

Si vous ne contrôlez pas l'API, vous pourrez peut-être désactiver la mise en cache de IE en ajoutant des en-têtes de requête sur le fichier ajax qui obtient:

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