web-dev-qa-db-fra.com

Empêcher Chrome de se mettre en cache AJAX demandes

J'ai installé une application et cela fonctionne à merveille sur Opera et Firefox, mais sur Google Chrome, il met en cache la demande AJAX et donne des données obsolètes!

http://gapps.qk.com.au est l'application. Lorsqu'il est exécuté dans Chrome, il n'envoie même pas les demandes AJAX, mais lorsqu'il est essayé dans un autre navigateur, il effectue toujours la demande AJAX et renvoie les données.

Existe-t-il une méthode (Apache/PHP/HTML/JS) permettant d'empêcher Chrome de suivre ce comportement?  

L'appel AJAX:

function sendAjax(action,domain,idelement) {

                    //Create the variables
                var xmlhttp,
                    tmp,
                    params = "action=" + action
                             + "&domain=" + encodeURIComponent(domain)

                    xmlhttp = new XMLHttpRequest(); 
                //Check to see if AJAX request has been sent
                xmlhttp.onreadystatechange = function () {
                    if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
                        $('#'+idelement).html(xmlhttp.responseText);
                    }
                };
                xmlhttp.open("GET", "ajax.php?"+params, true);
                xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                //console.log(params);
                xmlhttp.send(params);

            }
sendAjax('gapps','example.com','gapps');
23
Mattisdada

Le cache du navigateur se comporte différemment selon les paramètres. Vous ne devez pas dépendre des paramètres utilisateur ou du navigateur de l'utilisateur. Il est possible de faire en sorte que le navigateur ignore également les en-têtes. 

Il existe deux moyens d'empêcher la mise en cache.

-> Modifiez la demande AJAX en POST. Les navigateurs ne mettent pas en cache les demandes POST.

-> Better Way & good way: ajoutez un paramètre supplémentaire à votre demande avec l’horodatage actuel ou tout autre numéro unique.

params = "action=" + action 
         + "&domain=" + encodeURIComponent(domain) 
         + "&preventCache="+new Date();
30
gaurang171

Une autre alternative à la solution Javascript consiste à utiliser des en-têtes personnalisés: Dans PHP, cela ressemblerait à ceci:

<?php
   header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");//Dont cache
   header("Pragma: no-cache");//Dont cache
   header("Expires: Thu, 19 Nov 1981 08:52:00 GMT");//Make sure it expired in the past (this can be overkill)
?>
13
Mattisdada

J'utilisais jQuery ajax request quand j'ai rencontré ce problème. 

Selon API jQuery , ajouter "cache: false" ajoute un horodatage comme expliqué dans la réponse acceptée:

Cela ne fonctionne qu'avec les requêtes GET et HEAD, mais si vous utilisez POST, le navigateur ne met pas votre requête en cache de toute façon. Il y a un mais pour IE8, vérifiez-le dans le lien si nécessaire.

$.ajax({ 
type: "GET",
cache: false, 
});
1
iknownothing

La ligne de code ci-dessous a fonctionné pour moi.

$.ajaxSetup({ cache: false });
0
Puneet Mehra