Подтвердить что ты не робот

Как только документ HTML имеет манифест (cache.manifest), как его удалить?

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

<html manifest="cache.manifest">

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

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

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

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

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

4b9b3361

Ответ 1

Я изучал тот же вопрос, и он, похоже, не api для:

  • динамически активировать кеширование страницы
  • динамически приводит к тому, что страница перестает кэшироваться.

Вот лучшие ресурсы, которые я нашел:

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, выполните следующие подшаги: Отметьте группу кеша как устаревшую. Эта группа кэшей больше не существует для каких-либо целей, кроме обработки объектов Document, уже связанных с кешем приложения в группе кеша. Если кэш-группа имеет кэш приложения, флаг полноты которого неполный, то отбросьте этот кэш приложения.

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

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

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

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