Как только HTML-документ имеет манифест(кэш.manifest), как вы можете удалить его?

Кажется, что как только у вас есть запись манифеста, a la:

<html manifest="cache.manifest">

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

другими словами, если вы есть:

    .html (с определенным манифестом)
  • file1.js (ссылка в манифесте)
  • file2.js (ссылка в манифесте)
  • кэш.манифест (перечисляет два js файлы)

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

это похоже на довольно вопиющую ошибку, и она присутствует на iOS, а также на Mac-версиях Safari. Кто-нибудь нашел способ сбросить страницу и избавиться от кэша, не требуя вмешательства пользователя?

7 ответов


Ive исследовал тот же вопрос, и он, похоже, не является api для:

  1. динамически инициировать кэширование страницы
  2. динамически вызвать страницу, чтобы остановить кэширование.

вот лучшие ресурсы, которые у меня есть найдено:

http://www.html5rocks.com/tutorials/appcache/beginner/

http://www.thecssninja.com/javascript/how-to-create-offline-webapps-on-the-iphone

в частности, вот эта цитата из первой ссылки:

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

в противном случае нигде не упоминается о выгрузке кэша.

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

в google chrome пользователь может перейти по следующему URL:

chrome: / / appcache-internals/

и вручную отключите кэш. Конечно, при следующем посещении страницы она будет восстановлена, если страница имеет набор свойств манифеста.

Если вы посмотрите на спецификации:5.6 автономные веб-приложения

Это, кажется, предполагает ситуацию, когда кэш удаляется. В частности, раздел 5.6.4.5:

Если выборка манифеста завершается неудачно из-за ответа 404 или 410 или эквивалента, запустите эти подцепы: Пометить группу кэша как устаревшую. Этот группа кэша больше не существует ни для каких целей, кроме обработки объектов документа, уже связанных с кэшем приложения в группе кэша. Если группа кэша имеет кэш приложения, флаг завершенности которого является неполным, отбросьте этот кэш приложения.

затем он говорит:

Если это была попытка кэширования, отбросьте группу кэша вообще.

в основном, если запрос файла манифеста кэша приводит к 404, потом весь кэш должен быть отброшен. Итак, вы пытались заставить сервер вернуть 404 или 410 при запросе файла манифеста кэша? Это должно сработать. Трюк состоит в том, чтобы вернуть только 404 / 410 для страниц, с которых вы хотите удалить манифест (возможно, используя параметры url?).


одно из возможных решений:

  • измените манифест (чтобы он перезагрузился)
  • изменить главный файл (индекс.html) для ссылки на несуществующий манифест, поэтому он получает 404

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

должен быть лучший путь...


попробуйте просто удалить файл манифеста. Из документов mozzila:

кэши приложений также могут устаревать. Если манифест удаляется с сервера, браузер удаляет все кэши приложений, которые используют этот манифест, а затем отправляет "устаревшее" событие объекту кэша приложений. Затем состояние кэша приложений устанавливается в устаревшее.

Это также сработало для меня на chrome.


одним из решений, если вы используете IIS 7, является удаление типа Mime для .манифест или .тип файла appcache, добавленный для включения кэширования. Вы всегда можете добавить это обратно, если хотите снова включить кэширование. Вот что я сделал, чтобы исправить свою.


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

Это работает для нас.


Это может быть старым, но, надеюсь, все еще полезно для кого-то.

взгляните на заголовки HTTP в свойствах IIS. Посмотрите на включение или отключение истечения срока действия контента. Возможно, IIS все еще выполняет кэширование.


для целей развития (постоянные изменения), что мы сделали это:

  1. Set a-cache manifest file-под вашим серверным языком, например, мы используем PHP, поэтому наш кэш разработки называется " cache.декларация.php " и это указано таким же образом в теге html, как это:

    <html manifest="cache.manifest.php">
    
  2. поместите некоторую зависимую от времени строку (или что-то еще, что вам подходит) где-нибудь в манифесте в качестве комментария ( # - - - ), чтобы файл отличается каждый раз в то время (браузеры, похоже, сравнивают содержимое манифеста, а не дату), например, эта строка изменяет манифест каждую минуту, таким образом, все файлы будут повторно кэшироваться, если визит находится в другую минуту, как в последний раз.

    <?php if($dev) echo date("Y-m-d H:m"); ?>
    

мы только что протестировали эту процедуру с помощью Chrome, надеюсь, она работает в других, но если не ваши комментарии и советы будут очень хорошо оценены.