Принудительное управление кэшем: отсутствие кэширования в Chrome через XMLHttpRequest при перезагрузке F5
Я хочу убедиться, что данные, которые я запрашиваю через AJAX-вызов, являются свежими и не кэшируются. Для этого я отправляю заголовок Cache-Control: no-cache
Но моя версия Chrome 33 перекрывает этот заголовок Cache-Control: max-age=0
если пользователь нажимает F5.
Пример. Положить test.html
на вашем веб-сервере с содержанием
<script>
var xhr = new XMLHttpRequest;
xhr.open('GET', 'test.html');
xhr.setRequestHeader('Cache-Control', 'no-cache');
xhr.send();
</script>
В отладчике chrome на вкладке сеть я вижу вызов test.html AJAX. Код состояния 200. Теперь нажмите F5, чтобы перезагрузить страницу. Максимальный возраст: 0 и код состояния 304 Не изменен.
Firefox демонстрирует похожее поведение. Вместо того, чтобы просто перезаписать заголовок запроса, он изменяет его на Cache-Control: no-cache, max-age=0 на F5.
Могу ли я подавить это?
5 ответов
Альтернативой может быть добавление уникального номера в URL.
<script>
var xhr = new XMLHttpRequest;
xhr.open('GET', 'test.html?_=' + new Date().getTime());
//xhr.setRequestHeader('Cache-Control', 'no-cache');
xhr.send();
</script>
временная метка не совсем уникальна, но она должна быть достаточно уникальной для вашего варианта использования.
Использование строки запроса для управления кэшем в настоящее время не является лучшим вариантом по нескольким причинам, и (только) некоторые из них упоминаются в этом ответе. Он даже объясняет новый стандартный метод контроля версий. Хотя, если вы просто хотите иметь возможность установить заголовки запроса, правильный способ сделать это:
xhr.setRequestHeader('cache-control', 'no-cache, must-revalidate, post-check=0, pre-check=0');
xhr.setRequestHeader('cache-control', 'max-age=0');
xhr.setRequestHeader('expires', '0');
xhr.setRequestHeader('expires', 'Tue, 01 Jan 1980 1:00:00 GMT');
xhr.setRequestHeader('pragma', 'no-cache');
Надеюсь, что это поможет любому в будущем.
I tried (and failed) some sort of randomization to the URL, but it didn't work because the file I was accessing (.json) was being cached as well.
My solution was to add a timestamp to the call to the json file name (similar approach to ones above, slightly modified). This worked perfectly for me (code snippet below).
doSomething('files/data.json?nocache=' + (new Date()).getTime(), function(text){...
I'm very new at all of this so I'm sure there are reasons this isn't a standard/correct solution, but it worked for me.
http.setRequestHeader("Cache-Control", "no-cache, no-store, must-revalidate");
Удаление элемента и добавление нового элемента с помощью jQuery (я думаю, также JS) работает для меня в Chrome.
// Wordpress Context, selectedImage is an object from the Media Selector Dialog
const imageID = selectedImage.id
const imageURL = selectedImage.url
// This is a div with the img as an only child
const logoImageContainer = $('#q1nv0-preview-image-container')
let clone = $(logoImageContainer).find('img').clone()
// In the cloned img object I change the src to the new image
clone.removeAttr("src").attr('src', imageURL)
// Also I have to remove this in wordpress context:
clone.removeAttr("srcset")
// the div is cleared of the old image
$('#q1nv0-preview-image-container').empty()
// the new image is added to the div
$(logoImageContainer).prepend(clone)