Як програмувати порожній кеш браузера?


121

Я шукаю спосіб програмного спорожнення кешу браузера. Я роблю це, тому що програма кешує конфіденційні дані, і я хотів би видалити їх, коли натискаєте кнопку "Вийти з системи". Це станеться через сервер чи JavaScript. Звичайно, використання програмного забезпечення на закордонному / державному комп’ютері все ще перешкоджає, оскільки існує більше небезпек, таких як ключові реєстратори, які ви просто не можете перемогти на рівні програмного забезпечення.


3
Які браузери? Ви також повинні дивитися, щоб сказати браузеру, що не слід кешувати з сервера, а намагатися стерти його.
Mech Software

Ви також можете ознайомитись із цим підручником із кешування та як він працює. mnot.net/cache_docs охоплює заголовки кеш-керування та подібні речі
scrappedcola

@MechSoftware Я хочу кешувати для швидшого завантаження сторінки, але я хочу очистити його після виходу з системи. Переважно максимально гарну підтримку браузера.
Вежа

2
@rFactor Ніхто не використовує веб-переглядач, який дає веб-сайтам контроль над кешем.
NullUserException

3
Веб-сайти де-факто мають контроль над кешем, оскільки вони керують заголовками HTTP.
Дунайський матрос

Відповіді:


38

Можливо, ви можете просто використовувати jQuery для заміни мета-тегу, який посилається на статус кеша, на обробник події / кнопку, а потім оновити, легко,

$('.button').click(function() {
    $.ajax({
        url: "",
        context: document.body,
        success: function(s,x){

            $('html[manifest=saveappoffline.appcache]').attr('content', '');
                $(this).html(s);
        }
    }); 
});

ПРИМІТКА. Це рішення покладається на Кеш додатків, який реалізований як частина специфікації HTML 5. Також потрібна конфігурація сервера для налаштування маніфесту кешу додатків. Він не описує метод, за допомогою якого можна очистити "традиційний" кеш браузера за допомогою клієнтського або серверного коду, що майже неможливо зробити.


Це лише функція HTML5?
John Naegle

Я б сказав так, і я вважаю, що це також вимагає конфігурації сервера (для налаштування маніфесту кешу додатків). Незважаючи на те, що ця відповідь пропонує рішення початкового питання, вона затьмарює той факт, що очистити традиційний кеш браузера через код клієнта чи сервера неможливо.
Ерік Фуллер

Цей метод, здається, обходить кеш-пам'ять та оновлює вміст, але коли сторінка перезавантажується, вона повертається до раніше кешованого вмісту.
Простіший

застаріло на користь службовців developer.mozilla.org/en-US/docs/Web/HTML/…
nadav

2
Сервісні працівники не працюють на iPhone, тому вам доведеться використовувати кеш додатків там
tony

159

У жодному разі браузер не дозволить вам очистити кеш. Було б величезне питання безпеки, якби це було можливо. Це може бути дуже легко зловживати - щоразу, коли браузер підтримує таку "функцію", це буде та хвилина, коли я її видалюю з комп'ютера.

Що ви можете зробити, це сказати, щоб не кешувати вашу сторінку, надсилаючи відповідні заголовки або використовуючи ці метатеги:

<meta http-equiv='cache-control' content='no-cache'>
<meta http-equiv='expires' content='0'>
<meta http-equiv='pragma' content='no-cache'>

Ви також можете розглянути можливість вимкнення автоматичного заповнення у полях форм, хоча, боюся, існує стандартний спосіб зробити це ( див. Це питання ).

Незважаючи на те, я хотів би зазначити, що якщо ви працюєте з конфіденційними даними, ви повинні використовувати SSL. Якщо ви не використовуєте SSL, кожен, хто має доступ до мережі, може нюхати мережевий трафік і легко бачити, що бачить ваш користувач.

Використання SSL також змушує деякі браузери не використовувати кешування, якщо прямо не вказано. Дивіться це питання .


8
Чому я б очистив кеш свого веб-додатка, щоб дратувати користувачів? Я хочу це зробити, щоб очистити сліди кешованих приватних даних. Якщо я скажу браузеру не кешувати, він повинен запитувати мегабайти даних на стороні клієнта щоразу, коли сторінка завантажується, що не хочу ні робити.
Вежа

27
ніхто не хотів, бо очевидно це було б неможливо. Так само, як ви не можете запустити сценарії іншого джерела, не означає, що ви не можете запустити скрипт на своє походження. Якщо ви не можете очистити кеш-пам'ять на віддаленому джерелі, це логічно, але чому я не можу очистити кеш-походження, я виконую код? Немає причини, щоб цього не зробити, тому я дивлюсь, чи є рішення для цього, але, схоже, це неможливо. Якщо ви такі цікаві, я можу вам сказати, що у мене є велика програма із великою кількістю CSS, HTML та JS, зібраною приблизно до 6 Мб.
Вежа

4
@rFactor Це занадто багато.
NullUserException

14
Будь ласка, поясніть, як би це не було впровадженням, це буде проблемою безпеки? Це можна було б реалізувати безпечно.
Дан

22
Можливо, я не виспався минулої ночі, яким чином це було б питання безпеки, коли веб-додаток може очистити ( не змінити ) кеш? Як ти міг це використати?
Волкер Е.

19

використовуйте html сам. Є один трюк, який можна використовувати. Трюк полягає в тому, щоб додати параметр / рядок до імені файлу в тезі сценарію та змінити його, коли ви змінюєте файл.

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

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


1
для тих, хто використовує деяку динамічну мову на стороні сервера, якщо ви можете отримати доступ до файлу ctime, (або mtime), ви можете просто додати вказаний час за ним. Наприклад, у php, myfile.js?v=<?=filectime('myfile.js');?>і там ви отримали автоматичний кеш-оновлення для своїх ресурсів.
П’єр-Антуан Гійом

Я користувався цією технікою багато днів. Але я сьогодні помітив, що файл все одно виводиться з кешу навіть після того, як я змінив частину версії. Я використовував Chrome. Це було показано навіть після того, як я видалив файл із сервера. У когось є інформація, чому вона може не працювати?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ

Цей трюк працює, stackoverflow.com/questions/1922910/…
Невін

9

Найкраща ідея - зробити генерацію файлів js з ім'ям + якийсь хеш з версією, якщо вам потрібно очистити кеш, просто генеруйте нові файли з новим хешем, це запустить браузер для завантаження нових файлів


5

Спочатку я спробував різні програмні підходи в своєму HTML, JS, щоб очистити кеш браузера. На останньому Chrome не працює нічого.

Нарешті, я закінчив .htaccess:

<IfModule mod_headers.c>
    Header set Cache-Control "no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires 0
</IfModule>

Тестували в Chrome, Firefox, Opera

Довідка: https://wp-mix.com/disable-caching-htaccess/


4

location.reload (правда); буде важко перезавантажити поточну сторінку, ігноруючи кеш.
Cache.delete () також може використовуватися для нових хром, фаєрфоксу та опери.


Ця функція не працює з браузером Internet Explorer та браузером safari. Не впевнений, чи працювати з Microsoft Edge.
Цікавий розробник

3

У Chrome ви можете це зробити за допомогою розширення бенчмаркінгу. Почати хром потрібно за допомогою таких перемикачів:

./chrome --enable-benchmarking --enable-net-benchmarking 

У консолі Chrome тепер можна зробити наступне:

chrome.benchmarking.clearCache();
chrome.benchmarking.clearHostResolverCache();
chrome.benchmarking.clearPredictorCache();
chrome.benchmarking.closeConnections();

Як ви можете зрозуміти з наведених вище команд, він не тільки очищає кеш браузера, але й очищає кеш DNS і закриває мережеві з'єднання. Вони чудові, коли ви робите показник часу завантаження сторінки. Очевидно, що вам не доведеться використовувати їх усі, якщо не потрібно (наприклад, clearCache () повинно вистачити, якщо вам потрібно очистити кеш-пам'ять і не турбуватися про кеш-пам'ять і з'єднання DNS).


2

//The code below should be put in the "js" folder with the name "clear-browser-cache.js"

(function () {
    var process_scripts = false;
    var rep = /.*\?.*/,
    links = document.getElementsByTagName('link'),
    scripts = document.getElementsByTagName('script');
    var value = document.getElementsByName('clear-browser-cache');
    for (var i = 0; i < value.length; i++) {
        var val = value[i],
            outerHTML = val.outerHTML;
        var check = /.*value="true".*/;
        if (check.test(outerHTML)) {
            process_scripts = true;
        }
    }
    for (var i = 0; i < links.length; i++) {
        var link = links[i],
        href = link.href;
        if (rep.test(href)) {
            link.href = href + '&' + Date.now();
        }
        else {
            link.href = href + '?' + Date.now();
        }
    }
    if (process_scripts) {
        for (var i = 0; i < scripts.length; i++) {
            var script = scripts[i],
            src = script.src;
            if (src !== "") {
                if (rep.test(src)) {
                    script.src = src + '&' + Date.now();
                }
                else {
                    script.src = src + '?' + Date.now();
                }
            }
        }
    }
})();
At the end of the tah head, place the line at the code below

    < script name="clear-browser-cache" src='js/clear-browser-cache.js' value="true" >< /script >


3
Незрозуміло, як працює ця відповідь і наскільки вона краща за багато існуючих відповідей. Це можна значно покращити, описуючи підхід, який ви дотримуєтесь, а також супровідну документацію, яка показує, чому це спрацює
Vlad274

Незважаючи на те, що це не очищає кеш браузера, воно, схоже, кешує будь-які посилання на даній сторінці, просто додаючи парами.
Dan Chase

1

Тепер ви можете використовувати Cache.delete ()

Приклад:

let id = "your-cache-id";
// you can find the id by going to 
// application>storage>cache storage 
// (minus the page url at the end)
// in your chrome developer console 

caches.open(id)
.then(cache => cache.keys()
  .then(keys => {
    for (let key of keys) {
      cache.delete(key)
    }
  }));

Працює на Chrome 40+, Firefox 39+, Opera 27+ та Edge.


0

Уявіть, що .jsфайли розміщені в/my-site/some/path/ui/js/myfile.js

Так зазвичай тег сценарію виглядатиме так:

<script src="/my-site/some/path/ui/js/myfile.js"></script>

Тепер змініть це на:

<script src="/my-site/some/path/ui-1111111111/js/myfile.js"></script>

Тепер, звичайно, це не вийде. Для роботи вам потрібно додати один або кілька рядків до вашого .htaccess . Важливим рядком є: (цілий .htaccess внизу)

RewriteRule ^my-site\/(.*)\/ui\-([0-9]+)\/(.*) my-site/$1/ui/$3 [L]

Отже, що це робить, це видаляє 1111111111шлях із шляху та посилається на правильний шлях.

Отже, якщо ви внесете зміни, вам доведеться просто змінити номер 1111111111на будь-яке число, яке вам потрібно. Однак, якщо ви включаєте свої файли, ви можете встановити це число за допомогою часової позначки, коли js-файл востаннє змінений. Так кеш буде працювати нормально, якщо число не зміниться. Якщо він зміниться, він буде обслуговувати новий файл (ТАК ЗАВЖДИ), тому що браузер отримує повну нову URL-адресу і просто вважає, що файл настільки новий, він повинен його отримати.

Ви можете використовувати це для CSS, faviconsі що ніколи НЕ отримує кешируєтся. Для CSS просто використовуйте так

<link href="http://my-domain.com/my-site/some/path/ui-1492513798/css/page.css" type="text/css" rel="stylesheet">

І воно спрацює! Простий в оновленні, простий в обслуговуванні.

Обіцяний повний .htaccess

Якщо у вас немає .htaccess, це мінімальний рівень, який вам потрібно мати там:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteRule ^my-site\/(.*)\/ui\-([0-9]+)\/(.*) my-site/$1/ui/$3 [L]
</IfModule>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.