Предотвратить Chrome от кеширования AJAX-запросов

Я настроил приложение, и оно отлично работает в Opera и Firefox, но в Google Chrome он кэширует запрос AJAX и выдаст устаревшие данные!

http://gapps.qk.com.au/ это приложение. При запуске в Chrome он даже не отправляет запросы AJAX, но при попытке в другом браузере всегда выполняет запрос AJAX и возвращает данные.

Есть ли способ (Apache/PHP/HTML/JS), чтобы остановить Chrome от такого поведения?

Вызов 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');

4 ответа

Решение

Кеш браузера ведет себя по-разному на разных настройках. Вы не должны зависеть от пользовательских настроек или браузера пользователя. Можно также заставить браузер игнорировать заголовки.

Есть два способа предотвратить кеширование.

-> Измените запрос AJAX на POST. Браузеры не кэшируют POST-запросы.

-> Лучший способ и хороший способ: добавьте дополнительный параметр к вашему запросу с указанием текущего времени или любого другого уникального номера.

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

Другой альтернативой Javascript-решению является использование пользовательских заголовков: в PHP это будет выглядеть так:

<?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)
?>

Я использовал jQuery ajax запрос, когда столкнулся с этой проблемой.

Согласно API jQuery добавление "cache: false" добавляет метку времени, как объяснено в принятом ответе:

Это работает только с запросами GET и HEAD, но если вы используете POST, браузер не кэширует ваш ajax-запрос. Есть, но для IE8, проверьте это в ссылке, если это необходимо.

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

Ниже строка кода работает для меня.

$.ajaxSetup({ cache: false });
Другие вопросы по тегам