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

StackOverflow https://stackoverflow.com/questions/4542299

  •  13-10-2019
  •  | 
  •  

Вопрос

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

<html manifest="cache.manifest">

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

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

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

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

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

Это было полезно?

Решение

Я исследовал тот же вопрос, и, похоже, это не 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-внутренние компоненты/

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

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

Кажется, это наводит на мысль о ситуации, когда кэш удаляется.В частности, раздел 5.6.4.5:

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top