Я знаю, что я действительно опоздал на вечеринку, но я видел эту проблему в Firefox в течение многих лет и надеялся, что основная ошибка будет исправлена.
К сожалению, этого не произошло, но я наконец-то нашел обходной путь. В моем случае, пока загружается и обрабатывается новый файл .appcache, перезагрузка страницы не приводит к использованию новых кэшированных версий. Процесс, который я использую, выглядит следующим образом:
- index.html загружается и указывает файл .appcache в теге html.
- Файл .appcache генерируется динамически с использованием сценария PHP. Сценарий хэширует все включенные файлы для создания уникальной версии хэша, которая включена в манифест. Это означает, что изменение любых файлов, перечисленных в манифесте, приводит к перезагрузке кэша.
Мой файл .htaccess имеет следующее, чтобы предотвратить кэширование манифеста .appcache:
<Files *.appcache>
ExpiresActive On
ExpiresDefault "access plus 0 seconds"
</Files>
Мой код Javascript обнаруживает обновление appcache и перезагружает страницу после получения обновленных файлов:
appCache.addEventListener('updateready', function(e) {
console.log("Appcache update finished, reloading...");
setLoadingBar(100, "Loading...");
appCache.swapCache();
location.reload();
});
После перезагрузки страницы старый кэш все еще используется в Firefox, пока пользователь не очистит кэш вручную. Во всех других браузерах, которые я тестировал, новые кэшированные файлы вступают в силу.
Исправление оказалось болезненно простым!
Все, что было необходимо, это изменить строку location.reload()
, чтобы включить истинный параметр:
location.reload(true)
Кажется, это указывает на то, что Firefox обслуживает файлы из своего обычного кэша, а не использует хранимые файлы appcache, даже если файлы appcache новее. Я предполагаю, что это потому, что Firefox ставит нормальный механизм кэширования перед appcache следующим образом:
Запрос -> Обычный кэш -> Appcache -> Сетевой запрос
Но это только предположение.