Обновления автономного кэша HTML5 не отображаются в Firefox

У меня есть файл index.php в моей документации. Это производит вывод, который начинается с этого:

<!DOCTYPE html> 
<html manifest="manifest.appcache">

Manifest.appcache говорит браузерам кэшировать его для автономного использования. Опять же, соответствующие части:

CACHE MANIFEST

#version 8-25-2011

CACHE:

#internal HTML documents
#this tells the browser to cache the HTML it retrieves from http://example.com/
/

NETWORK:
*

Автономный доступ работает нормально с этой настройкой, но обновление не работает, как я ожидал в Firefox.

В Chrome и Safari, когда я обновляю файл index.php, а затем изменяю комментарий в файле cache.manifest, браузеры получают новый вывод index.php и используют его в кэше.

Однако в Firefox, кажется, не важно, что я обновил файл manifest.appcache. Я подозреваю, что если я подожду достаточно долго, он обновится, но я пробовал ждать часы.

Как я могу найти и устранить мою проблему с кэшированием?

2 ответа

Решение

Какие заголовки кеша HTTP вы отправляете вместе с файлом index.php? Если вы не установили такие вещи, как Cache-control: а также Expires: Затем заголовки Firefox могут обновлять версию страницы в кеше приложения из обычного кеша, а не запрашивать ее снова с сервера.

РЕДАКТИРОВАТЬ ПОСТЕРОМ ВОПРОСА:

Для тех, кто хочет знать, что именно это произошло, вот что я положил в свой файл.htaccess на основе этого ответа и прочтения http://www.diveintohtml5.info/offline.html:

<Files *.appcache>
    ExpiresActive On
    ExpiresDefault "access"
</Files>

Надеюсь, что поможет следующему человеку!

Я знаю, что я действительно опоздал на вечеринку, но я видел эту проблему в Firefox в течение многих лет и надеялся, что основная ошибка будет исправлена.

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

  1. index.html загружается и указывает файл.appcache в теге html.
  2. Файл.appcache генерируется динамически с использованием сценария PHP. Сценарий хэширует все включенные файлы, чтобы создать уникальную версию хэша, которая включена в манифест. Это означает, что изменение любых файлов, перечисленных в манифесте, приводит к перезагрузке кэша.
  3. Мой файл.htaccess содержит следующее, чтобы предотвратить кэширование манифеста.appcache:

    <Files *.appcache> ExpiresActive On ExpiresDefault "access plus 0 seconds" </Files>

  4. Мой код Javascript обнаруживает обновление appcache и перезагружает страницу после загрузки обновленных файлов:

    appCache.addEventListener('updateready', function(e) { console.log("Appcache update finished, reloading..."); setLoadingBar(100, "Loading..."); appCache.swapCache(); location.reload(); });

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

Исправление оказалось до боли простым!

Все, что нужно было, чтобы изменить location.reload() строка для включения истинного параметра:

location.reload(true)

Похоже, это указывает на то, что Firefox обслуживает файлы из своего обычного кэша, а не использует хранимые файлы appcache, даже если файлы appcache новее. Я предполагаю, что это потому, что Firefox ставит нормальный механизм кэширования перед appcache следующим образом:

Запрос -> Обычный кеш -> Appcache -> Сетевой запрос

Но это только предположение.

Другие вопросы по тегам