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