Как только вы можете удалить манифест HTML-документа (cache.manifest)? - PullRequest
20 голосов
/ 28 декабря 2010

Кажется, что когда у вас есть запись манифеста, например:

<html manifest="cache.manifest">

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

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

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

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

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

Ответы [ 7 ]

17 голосов
/ 28 декабря 2010

Я исследовал тот же вопрос, и он, кажется, не 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:

хром: // AppCache-Внутренности /

И вручную отключить кеш. Разумеется, в следующий раз, когда они посетят страницу, она будет повторена, если для страницы установлено свойство manifest.

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

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

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

Затем говорится:

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

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

4 голосов
/ 28 декабря 2010

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

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

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

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

2 голосов
/ 22 февраля 2012

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

Кэши приложений также могут устареть. Если манифест удаляется с сервера, браузер удаляет все кэши приложений, использующие этот манифест, а затем отправляет «устаревшее» событие в объект кэша приложения. Тогда состояние кеша приложения устанавливается на УСТАРЕЛО.

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

1 голос
/ 07 апреля 2014

Что мы делаем, так это удаляем список файлов в манифесте, поэтому он не выделяется ни при каких условиях.

У нас это работает.

1 голос
/ 30 июля 2013

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

0 голосов
/ 20 ноября 2016

Для целей разработки (постоянные изменения) мы сделали следующее:

  1. Установите файл манифеста -cache на вашем языке SERVER-SIDE, дляНапример, мы используем PHP, поэтому наш кэш разработки называется «cache.manifest.php», и он указывается таким же образом в теге html следующим образом:

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

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

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

0 голосов
/ 15 октября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...