Je rencontre des problèmes dans mon React application on IE11
où l'interface utilisateur ne frappe pas les services d'arrière-plan pour chaque nouvelle demande et renvoie la réponse à partir des données de cache. L'application fonctionne bien sur Chrome.
Dans le cas de IE les services se terminent par le code: 304 au lieu de 200. PFB les en-têtes de requête:
Accept application/json,*/*
Request GET /services/v0/search/?uid=12900 HTTP/1.1
Content-Type application/json
Cache-Control no-cache
PFB les en-têtes de réponse obtenus sur IE
:
Response HTTP/1.1 304 Not Modified
x-frame-options DENY
x-xss-protection 1; mode=block
x-content-type-options nosniff
Tout indice, quelle pourrait être la raison derrière IE rendre un tel comportement? TIA
Vous pouvez essayer d'ajouter l'en-tête "Pragma":
headers: { Pragma: 'no-cache'}
également mentionné ici: Axios appelé une seule fois dans la fonction auto-invoquante (Internet Explorer)
De docs
Vérifiez cet en-tête dans votre demande http:
Contrôle du cache:
no-cache
: Force les caches à soumettre la demande au serveur Origin pour validation avant de libérer une copie mise en cache
no-store
: Le cache ne doit rien stocker sur la demande du client ou la réponse du serveur.
must-revalidate
(Revalidation and reloading
):
Le cache doit vérifier l'état des ressources périmées avant de l'utiliser et celles expirées ne doivent pas être utilisées
Expires
: 0 -la ressource est déjà expirée
Si les solutions côté client ne fonctionnent pas en dernier recours, vous pouvez essayer de définir les en-têtes côté serveur. Si vous utilisiez node
et express
, vous pourriez écrire un middleware qui ajouterait pour vous les en-têtes des routes souhaitées, qui pourrait ressembler à ceci:
function cacheMiddleware(req, res, next) {
// Should work for detecting IE8+
if (req.headers['user-agent'].includes('Trident')) {
res.set({
'Cache-Control': 'no-store, no-cache, must-revalidate',
Pragma: 'no-cache',
Expires: new Date('01.01.2000'),
});
}
next();
}
router.get('/', cacheMiddleware, (req, res) => res.send('content'))
Idée pour la solution de lien
Je viens de rencontrer le même problème où IE11 ignore simplement la demande get au serveur principal. Le moyen rapide que j'ai trouvé pour corriger est de passer un paramètre inutile avec la demande get, dans notre cas, un horodatage.
const t = Date.now();
axios.get(`${API_DOMAIN}/api/bookingep/find?c=${t}`);
Parce que chaque fois que l'horodatage est différent, le ie11 envoie la requête get comme prévu.