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

HTML5 - проявление кэша отлично работает на Chrome, но не на Firefox и Opera

Я разрабатываю веб-приложение для автономного использования, поэтому мне нужно использовать функциональность кеша приложения.

Все отлично работает в Chrome (15.0.874.106), но не работает в Firefox (7.0.1) и Opera (11.52).

Это мой файл манифеста кэша cache.manifest.php (я уменьшил его до минимума):

<?php 
    header("Cache-Control: max-age=0, no-cache, no-store, must-revalidate");
    header("Pragma: no-cache");
    header("Expires: Wed, 11 Jan 1984 05:00:00 GMT");
    header('Content-type: text/cache-manifest');
?>CACHE MANIFEST

CACHE:

/app/common/css/reset.css
/favicon.ico

И это первые 4 строки основного документа HTML:

<!DOCTYPE html> 
<html manifest="/app/mobile/cache.manifest.php"> 
    <head> 
    <title>MyApp Mobile</title> 

Когда я пытаюсь загрузить манифест кэша (http://www.myapp.com/app/mobile/cache.manifest.php) в браузер, файл отображается правильно, но когда я пытаюсь загрузить страницу один раз в автономном режиме Я получаю страницу ошибки "Невозможно подключиться". Опять же, это просто происходит в Firefox и Opera.

Firebug говорит "0 items in offline cache", и я не нашел способ проверить кэш приложения на DragonFly.

Я злюсь, и я не знаю, как эффективно отлаживать проблему в Firefox и Opera. Пожалуйста, помогите.

Спасибо, Dan

4b9b3361

Ответ 1

По моему опыту использования AppCache HTML5, это здорово, когда вы его работаете, но чрезвычайно хрупким. Если в нем крошечная ошибка, браузер игнорирует весь файл и, досадно, вместо использования обычного кеша браузера, перезагружает все с нуля с сервера.

Хуже того, браузеры не будут повторно загружать файл манифеста, если его текстовый контент не изменится. Таким образом, вы можете настроить заголовки серверов или что-то в этом, но если содержимое cache.manifest.php не изменится, браузер слепо проигнорирует его и сделает то, что он сделал в прошлый раз. Таким образом, он мог быть сломан, затем вы исправили его, но браузеры игнорируют изменения, потому что текстовое содержимое cache.manifest.php не изменилось. Это даже кажется невосприимчивым к очистке кеша браузера, что является частью того, что делает его настолько запутанным - кэш приложений действительно, действительно серьезно относится к кешированию.

Чтобы обойти это, текст изменяется в количестве комментариев, поэтому у вас есть комментарий вверху с версией или меткой времени или датой (например, # Version 1.2) и измените это, когда вы хотите, чтобы браузер "заметил".

Затем браузер все равно не будет сразу использовать его! То, как работает кеш приложений, в следующий раз, когда вы загрузите страницу, он будет делать то же самое, что и в прошлый раз, и начнет проверку обновления в фоновом режиме. Таким образом, вы, вероятно, хотите, чтобы консоль дождалась чего-то вроде "update...", затем "complete", затем нажмите "Обновить", и браузер, наконец, начнет использовать новую версию. Наконец!

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

Совместимость стандартов браузеров в наши дни очень хороша, поэтому я думаю, что на самом деле у вас есть работа, но вы проверили Chrome last, и это единственный браузер, который правильно кэшировал файл манифеста. Во время разработки вы, возможно, сломались, но Firefox и Opera сжимают свои старые файлы манифеста до смерти. Бьюсь об заклад, вы также попытались очистить кеш браузера в Firefox и Opera, что, вероятно, ничего не изменило - вам нужно изменить текстовое содержимое файла и дважды обновить до того, как Firefox или Opera окончательно откажутся от своих сломанных версий файла манифеста и начните использовать ту, которая работает, которую вы, вероятно, загрузили много лет назад.

Ответ 2

От: http://appcache.offline.technology

В Firefox любые ресурсы, обслуживаемые с помощью Cache-control: no-store не будут кэшироваться, даже если они явно включены в манифест.

Мой php по умолчанию отправляет:

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Достаточно добавить:

header("Cache-Control: no-cache, must-revalidate");

В php файл, чтобы он начал кэшировать его.

(Это похоже на ответ Мичала Хакмана, но немного более конкретный).

Ответ 3

Для меня ваш манифест кэша выглядит немного "необычным"... он может помочь добавить раздел FALLBACK... еще один момент заключается в том, что приложение может вмешиваться в "обычный кеш браузера", то есть, если манифест кэша он должен убедиться, что браузер перезагружает его, в идеале это достигается путем изменения имени (например, с указанием номера версии, метки времени... как части имени).

Вы можете взаимодействовать на своей странице с помощью appcache через JS, что может помочь выявить проблему, которую вы видите.

Для подробной информации, включая JS-код и тщательный просмотр, см.

Если вам нужно вернуться с конкретными вопросами.

ОБНОВЛЕНИЕ

В соответствии с комментариями, представленными OP в этом, показана хорошая реализация JS API для проверки/отладки appcache, как описано в ссылках выше.

Ответ 4

Вы можете проверить текущий статус кэша приложений с помощью window.applicationCache.status, который возвращает числовое значение, отображаемое в следующие состояния: 0 - uncached, 1 - idle, 2 - checking, 3 - downloading, 4 - updateready, 5 - obsolete.

API кэш приложений имеет несколько замечаний: window.applicationCache.update(): Это вызовет процесс загрузки кеша приложения, который почти совпадает с перезагрузкой страницы. Он просто проверяет, изменился ли манифест, и, если это так, загружает свежую версию всего содержимого в кеше (с учетом любых заголовков кеша). Обратите внимание, что даже при создании нового кеша страница будет продолжать использовать старый кеш. Чтобы страница использовала новый кеш, который вы только что загрузили, вы должны использовать функцию swapCache().

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

from: http://dev.opera.com/articles/view/offline-applications-html5-appcache/

Ответ 5

Проверьте кеш в about:cache. Я уверен, вы увидите "размер данных размером 0 байт" для ваших файлов PHP.

Проверьте свои заголовки кеширования, которые я нашел в Firefox по умолчанию был "no-cache" в моих php файлах. Я просто добавил:

header("Pragma: public");
header("Cache-Control: public, max-age=6000");

в мой файл PHP и перезагрузили автономный кеш, и он, наконец, работает.

НТН

Ответ 6

Попробуйте удалить:

header("Cache-Control: max-age=0, no-cache, no-store, must-revalidate");
header("Pragma: no-cache");
header("Expires: Wed, 11 Jan 1984 05:00:00 GMT");

так что вы отправляете только заголовок Content-type:

<?php header('Content-type: text/cache-manifest'); ?>

ApplicationCache принудительно кэширует (упрощает, но не сильно). Эти первые три заголовка - это способы предотвращения кеширования.

Opera, похоже, предотвращает кеширование при наличии этих заголовков. Утилиты для отладки Firefox немного отвратительны, когда дело доходит до отладки AppCache, но это, вероятно, сэкономить, чтобы предположить, что это также исправит его там.

Ответ 7

Для Firefox попробуйте этот небольшой трюк:

<html manifest="/app/mobile/cache.manifest.php?1"> 

Его "? 1", который, наконец, заставит Firefox проверить последний файл. Это и твой трюк для меня. Надеюсь, это поможет.

Ответ 8

Из моего опыта работы с сайтом, работающим в автономном режиме на iPad:

  • Имя файла должно заканчиваться на .manifest
  • Тип mime должен быть text/cache-manifest
  • У вас есть версия в комментариях вашего манифеста
  • Создайте некоторые функции javascript, используя window.applicationCache..., чтобы проверить, видит ли браузер изменения в манифесте и перезагружает контент, а также фиксирует события состояния и отображает их где-то

См. также: http://developer.apple.com/library/safari/#documentation/iPhone/Conceptual/SafariJSDatabaseGuide/OfflineApplicationCache/OfflineApplicationCache.html#//apple_ref/doc/uid/TP40007256-CH7-SW1

Ответ 9

У меня была аналогичная проблема. Я очень поздно отвечаю, но это может быть полезно для других. Убедитесь, что вы не столкнулись с проблемами, описанными AshleysBrian в его ответе. Добавление к этому

  • Убедитесь, что файл манифеста подан в виде "text/cache-manifest"
  • Не пытайтесь использовать его в режиме частного просмотра в Firefox/IE. Он работает только в обычном режиме просмотра. Но он работает в обоих режимах в Chrome
  • В автономном режиме простым изменением URL-адреса может быть проблема

    Eg: http://localhost:8080/app doesn't work on Firefox/IE
    but http://localhost:8080/app/ works in Firefox/IE 
    

    Оба они работают в Chrome

  • Используйте эти удобные средства просмотра ресурсов, чтобы получить более подробную перспективу

    about:cache - Firefox
    chrome://appcache-internals/ - Chrome
    Pls fill in if someone knows what is it for IE
    

Ответ 10

Как я понимаю, раздел автономных веб-приложений в проекте W3C HTML5 ненормативный; что означает, что он до сих пор не является частью официального стандарта HTML5.

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

Ответ 11

Я нашел нечто подобное и отследил его до заголовка Cache-Control: no-store в манифесте. Chrome принимает это, но Firefox терпит неудачу с этим.

Мои тесты показали, что вы можете хранить заголовки без кеша и заканчивать заголовки, чтобы обеспечить частые обновления.

Ответ 12

Мой единственный способ заставить манифест работать повсюду - это сделать:

CACHE MANIFEST
# version x.x
# 2015-03-27

# list everything

Если я использую NETWORK и/или FALLBACK, он не будет работать (в Chrome).

Ответ 13

У меня была та же проблема. Все работало отлично в Chrome и IE, но сообщение "Не удалось подключиться" в FF.

После нескольких часов отчаяния я нашел решение, и это было смешно просто: В панели инструментов разработчика весь кеш был деактивирован. :/