Использовать браузер для очистки кеша

Есть ли способ разместить код на моей странице, поэтому, когда кто-то посещает сайт, он очищает кеш браузера, поэтому они могут просматривать изменения?

Используемые языки: ASP.NET, VB.NET и, конечно, HTML, CSS и jQuery.

Ответ 1

Если речь идет о изменениях .css и .js, один из способов заключается в том, чтобы "кэшировать busting", добавив что-то вроде "_versionNo" к имени файла для каждой версии. Например:

script_1.0.css // This is the URL for release 1.0
script_1.1.css // This is the URL for release 1.1
script_1.2.css // etc.

Или, альтернативно, сделайте это после имени файла:

script.css?v=1.0 // This is the URL for release 1.0
script.css?v=1.1 // This is the URL for release 1.1
script.css?v=1.2 // etc.

Вы можете проверить эту ссылку , чтобы узнать, как она может работать.

Ответ 2

Посмотрите на кеш-контроль, а истечет META Tag.

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="EXPIRES" CONTENT="Mon, 22 Jul 2002 11:12:01 GMT">

Другими распространенными практиками являются добавление постоянно изменяющихся строк в конец запрошенных файлов. Например:

<script type="text/javascript" src="main.js?v=12392823"></script>

Ответ 3

Обновление 2012

Это старый вопрос, но я думаю, он нуждается в более актуальном ответе, потому что теперь есть способ получить больше контроля над кешированием веб-сайтов.

В автономных веб-приложениях (на самом деле это любой веб-сайт HTML5) applicationCache.swapCache() можно использовать для обновите кешированную версию вашего сайта без необходимости ручной перезагрузки страницы.

Это пример кода из Руководства для начинающих по использованию кэша приложений на скалах HTML5, в котором объясняется, как обновлять пользователей до последней версии вашего сайта:

// Check if a new cache is available on page load.
window.addEventListener('load', function(e) {

  window.applicationCache.addEventListener('updateready', function(e) {
    if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
      // Browser downloaded a new app cache.
      // Swap it in and reload the page to get the new hotness.
      window.applicationCache.swapCache();
      if (confirm('A new version of this site is available. Load it?')) {
        window.location.reload();
      }
    } else {
      // Manifest didn't changed. Nothing new to server.
    }
  }, false);

}, false);

См. также Использование кэша приложений в Mozilla Developer Network для получения дополнительной информации.

Обновление 2016

Вещи быстро меняются в Интернете. Этот вопрос был задан в 2009 году, а в 2012 году я опубликовал обновление о новом способе решения проблемы, описанной в вопросе. Прошло еще 4 года, и теперь кажется, что он уже устарел. Благодаря cgaldiolo для указания его в комментариях.

В настоящее время по состоянию на июль 2016 года HTML-стандарт, раздел 7.9, автономные веб-приложения содержит предупреждение об отказе:

Эта функция находится в процессе удаления с веб-платформы. (Это длительный процесс, который занимает много лет.) Используя любой из автономные функции веб-приложений в это время сильно обескуражены. Вместо этого используйте сервис-работников.

Так делает использование кэша приложений в сети Mozilla Developer Network, на которую я ссылался в 2012 году:

Устаревшая версия Эта функция удалена из веб-стандартов. Хотя некоторые браузеры все еще могут его поддерживать, он находится в процессе сбрасывается. Не используйте его в старых или новых проектах. Страницы или веб-приложения его использование может прерываться в любое время.

См. также Ошибка 1204581 - добавьте уведомление об устаревании для AppCache, если включен перехват службы рабочего процесса.

Ответ 4

Не как таковой. Один из способов - отправить соответствующие заголовки при доставке контента, чтобы заставить перезагрузить браузер:

Убедитесь, что веб-страница не кэширована, во всех браузерах.

Если вы ищете "cache header" или что-то подобное здесь в SO, вы найдете конкретные примеры ASP.NET.

Другой, менее чистый, но иногда единственный способ, если вы не можете управлять заголовками на стороне сервера, добавляет случайный параметр GET к вызываемому ресурсу:

myimage.gif?random=1923849839

Ответ 5

Для статических ресурсов правильное кэширование будет использовать параметры запроса со значением каждой версии развертывания или файла. Это приведет к очистке кеша после каждого развертывания.

/Content/css/Site.css?version={FileVersionNumber}

Вот пример ASP.NET MVC.

<link href="@Url.Content("~/Content/Css/Reset.css")[email protected]().Assembly.GetName().Version" rel="stylesheet" type="text/css" />

Не забудьте обновить версию сборки.

Ответ 6

У меня был случай, когда я буду фотографировать клиентов в Интернете и вам нужно будет обновить div, если будет изменена фотография. Браузер все еще показывал старую фотографию. Поэтому я использовал взлом вызова случайной переменной GET, которая была бы уникальной каждый раз. Вот он, если он может помочь кому-либо

<img src="/photos/userid_73.jpg?random=<?php echo rand() ?>" ...

ИЗМЕНИТЬ Как было отмечено другими, следующее гораздо более эффективное решение, поскольку оно будет перезагружать изображения только тогда, когда они будут изменены, идентифицируя это изменение по размеру файла:

<img src="/photos/userid_73.jpg?modified=<? filemtime("/photos/userid_73.jpg")?>"

Ответ 7

У меня была подобная проблема, и вот как я ее решил:

  • В файле index.html я добавил манифест:

    <html manifest="cache.manifest">
    
  • В разделе <head> включен script обновление кеша:

    <script type="text/javascript" src="update_cache.js"></script>
    
  • В разделе <body> я вставил функцию onload:

    <body onload="checkForUpdate()">
    
  • В cache.manifest я поставил все файлы, которые я хочу кэшировать. Сейчас важно, что он работает в моем случае (Apache), просто обновляя каждый раз комментарий версии. Также можно указать файлы с именем "? Ver = 001" или что-то в конце имени, но не требуется. Изменение только # version 1.01 запускает событие обновления кеша.

    CACHE MANIFEST
    # version 1.01
    style.css
    imgs/logo.png
    #all other files
    

    Важно указать 1., 2. и 3. точки только в index.html. В противном случае

    GET http://foo.bar/resource.ext net::ERR_FAILED
    

    происходит потому, что каждый "дочерний" файл пытается кэшировать страницу, пока страница уже кэширована.

  • В файле update_cache.js я поставил этот код:

    function checkForUpdate()
    {
        if (window.applicationCache != undefined && window.applicationCache != null)
        {
            window.applicationCache.addEventListener('updateready', updateApplication);
        }
    }
    function updateApplication(event)
    {
        if (window.applicationCache.status != 4) return;
        window.applicationCache.removeEventListener('updateready', updateApplication);
        window.applicationCache.swapCache();
        window.location.reload();
    }
    

Теперь вы просто меняете файлы, а в манифесте вы должны обновлять комментарий к версии. Теперь посещение страницы index.html будет обновлять кеш.

Части решения не мои, но я нашел их через Интернет и собрал вместе, чтобы он работал.

Ответ 9

Не уверен, что это может действительно помочь вам, но то, как кеширование должно работать в любом браузере. Когда браузер запрашивает файл, он всегда должен отправлять запрос на сервер, если не существует "автономный" режим. Сервер будет читать некоторые параметры, такие как изменение даты или etags.

Сервер вернет 304 ответ об ошибке для NOT MODIFIED, и браузеру придется использовать его кеш. Если этаг не проверяется на стороне сервера или измененная дата ниже текущей измененной даты, сервер должен вернуть новое содержимое с новой измененной датой или etags или и тем, и другим.

Если в браузере нет данных кэширования, я думаю, что поведение не определено, браузер может или не может кэшировать файл, который не сообщает, как они кэшируются. Если вы зададите параметры кэширования в ответе, он будет правильно кэшировать ваши файлы, а затем сервер может выбрать ошибку 304 или новый контент.

Вот как это должно быть сделано. Использование случайных параметров или номера версии в URL-адресах больше похоже на взлом, чем что-либо.

http://www.checkupdown.com/status/E304.html http://en.wikipedia.org/wiki/HTTP_ETag http://www.xpertdeveloper.com/2011/03/last-modified-header-vs-expire-header-vs-etag/

После прочтения я увидел, что есть и срок действия. Если у вас есть проблемы, возможно, у вас установлена ​​дата истечения срока действия. Другими словами, когда браузер будет кэшировать ваш файл, так как он имеет дату истечения срока действия, ему не нужно запрашивать его еще до этой даты. Другими словами, он никогда не будет запрашивать файл на сервере и никогда не получит 304, не измененный. Он будет просто использовать кеш до тех пор, пока не будет достигнута дата истечения срока действия или кэш не будет очищен.

Итак, это моя догадка, у вас есть какая-то дата истечения срока действия, и вы должны использовать модифицированные etags или сочетание всего этого и убедиться, что нет даты истечения срока действия.

Если люди имеют тенденцию часто обновляться, и файл не изменяется сильно, тогда было бы разумно установить большую дату истечения срока действия.

Мои 2 цента!

Ответ 10

Здесь - это страница MDSN по настройке кэширования в ASP.NET.

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60))
Response.Cache.SetCacheability(HttpCacheability.Public)
Response.Cache.SetValidUntilExpires(False)
Response.Cache.VaryByParams("Category") = True

If Response.Cache.VaryByParams("Category") Then
   '...
End If

Ответ 11

Я реализовал это простое решение, которое работает для меня (еще не в рабочей среде):

function verificarNovaVersio() {
    var sVersio = localStorage['gcf_versio'+ location.pathname] || 'v00.0.0000';
    $.ajax({
        url: "./versio.txt"
        , dataType: 'text'
        , cache: false
        , contentType: false
        , processData: false
        , type: 'post'
     }).done(function(sVersioFitxer) {
        console.log('Versió App: '+ sVersioFitxer +', Versió Caché: '+ sVersio);
        if (sVersio < (sVersioFitxer || 'v00.0.0000')) {
            localStorage['gcf_versio'+ location.pathname] = sVersioFitxer;
            location.reload(true);
        }
    });
}

У меня есть маленький файл, где html:

"versio.txt":

v00.5.0014

Эта функция вызывается на всех моих страницах, поэтому при загрузке она проверяет, является ли значение версии localStorage ниже текущей версии и делает

location.reload(true);

... чтобы перезагрузить сервер из кэша.

(очевидно, вместо localStorage вы можете использовать файлы cookie или другое постоянное хранилище клиентов)

Я выбрал это решение для его простоты, потому что только поддержка одного файла "versio.txt" заставит весь сайт перезагрузиться.

Метод queryString трудно реализовать и также кэшируется (если вы измените с версии 1.1 на предыдущую версию, будет загружаться из кеша, то это означает, что кеш не очищается, сохраняя все предыдущие версии в кеше).

Я немного новичок, и я бы оценил вашу профессиональную проверку и проверку, чтобы мой метод был хорошим подходом.

Надеюсь, что это поможет.

Ответ 12

Множество ответов отсутствует, большинство разработчиков хорошо знают, что отключить кеш неэффективно. Тем не менее, существует множество распространенных обстоятельств, когда эффективность неважна, а поведение кэша по умолчанию сильно нарушено.

К ним относятся вложенное, итеративное тестирование script (большое!) и поврежденные сторонние программные решения. Ни одно из приведенных здесь решений не подходит для решения таких общих сценариев. Большинство веб-браузеров являются слишком агрессивным кэшированием и не предоставляют разумных средств для предотвращения этих проблем.

Ответ 14

Существует один трюк, который можно использовать. Трюк заключается в том, чтобы добавить параметр/строку к имени файла в теге script и изменить его при изменении файла.

<script src="myfile.js?version=1.0.0"></script>

Браузер интерпретирует всю строку как путь к файлу, даже если что-то происходит после "?" являются параметрами. Итак, wat теперь происходит, когда в следующий раз, когда вы обновите свой файл, просто измените номер в теге script на вашем сайте (пример <script src="myfile.js?version=1.0.1"></script>), и каждый пользовательский браузер увидит, что файл изменился и захватил новую копию.

Ответ 15

/custom.js?id=1

работал и на меня. Добавляя ?id=*, пользователи не должны нажимать CTRL + F5, чтобы обновить кеш.

Ответ 16

Использовать браузеры для очистки кеша или перезагрузки правильных данных? Я пробовал большинство решений, описанных в stackoverflow, некоторые работы, но через некоторое время он в конечном итоге кэширует и отображает предыдущие загруженные script или файл. Есть ли другой способ очистить кеш (css, js и т.д.) И фактически работать во всех браузерах?

Я обнаружил, что конкретные ресурсы можно перезагрузить отдельно, если вы измените дату и время на своих файлах на сервере. "Очистить кеш" не так просто, как должно быть. Вместо того, чтобы очищать кеш в моих браузерах, я понял, что "касание" кешированных файлов сервера фактически изменит дату и время исходного файла, кэшированного на сервере (протестировано на Edge, Chrome и Firefox), и большинство браузеров автоматически загрузит текущая свежая копия Whats на вашем сервере (код, графика любого мультимедиа тоже). Я предлагаю вам просто скопировать самые последние сценарии на сервере и сделать "дело касания" до запуска вашей программы, поэтому он изменит дату всех ваших проблемных файлов на самую последнюю дату и время, затем он загружает новую копию в ваш браузер:

<?php
   touch('/www/sample/file1.css');
   touch('/www/sample/file2.js');
?>

тогда... остальная часть вашей программы...

Мне потребовалось некоторое время, чтобы решить эту проблему (так как многие браузеры действуют по-разному для разных команд, но все они проверяют время на файлы и сравнивают с вашей загруженной копией в вашем браузере, если разные даты и время будут делать обновление), Если вы не можете сделать правильный путь, всегда есть другое полезное и лучшее решение. С наилучшими пожеланиями и счастливый кемпинг. Кстати touch(); или альтернативы работают во многих языках программирования, включая javascript bash sh php, и вы можете включать или вызывать их в html.

Ответ 17

Вы хотите очистить кеш или просто убедитесь, что ваша текущая (измененная?) страница не кэширована?

Если последнее, оно должно быть таким же простым, как

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">