HTML 5 Cache манифест получает само кэшируется
У меня проблема в том, что кажется, что файл cache.manifest кэшируется сам. Это означает, что (Mobile) Safari не учитывает все изменения файла, поэтому он никогда не будет обновляться и всегда отображает последние кэшированные файлы.
Я пытался избежать этого с помощью .htaccess
файл в том же каталоге, что и cache.manifest
файл:
ExpiresActive On
ExpiresDefault "access"
Это не помогло, поэтому я изменил cache.manifest в php-файле, который содержит следующие заголовки:
header("Expires: Mon, 26 Jul 1990 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header('Content-Type: text/cache-manifest');
У кого-нибудь есть другие идеи, как я могу убедиться, что сам файл кэша будет восстановлен, если это возможно?
Работает на: Safari (Desktop), Chrome (Samsung Galaxy Tab v10.1), Firefox
Не работает: Chrome, Safari (iOS)
Переименовал cache.manifest.php обратно в cache.manifest и добавил следующие строки в.htaccess
<IfModule mod_expires.c>
Header set Cache-Control "public"
ExpiresActive on
# cache.manifest needs re-requests in FF 3.6 (thx Remy ~Introducing HTML5)
ExpiresByType text/cache-manifest "access plus 0 seconds"
</IfModule>
Если я изменю комментарий к ревизии в cache.manifest и обновлю его в Safari (iOS), он все равно покажет мне старый файл. Я невежественен.
4 ответа
Согласно документации HTML5, если файл манифеста кеша приложения является побайтовым, как и предыдущий, независимо от заголовков кеша HTTP для срока действия /etc, считается, что он не требует обновления.
В нижней части файла манифеста кеша необходимо добавить комментарий внизу файла с отметкой времени последнего измененного файла, например:
# last modified: Thu, 30 Jun 2011 01:19:46 GMT
Это нарушит побайтовую идентичность, даже если список файлов останется прежним, но некоторые из них будут обновлены.
Как упоминалось в других ответах, манифесты кэша - это настоящая боль, с которой приходится иметь дело.
Я подправил скрипт "build" манифеста PHP для моего приложения для блокнота HTML5.
Протестировано и работает на Chrome, Firefox, IE8+, Android и iOS.
Он с открытым исходным кодом и доступен здесь: https://github.com/JasonHanley/note5/blob/master/build.php
Я также использую текстовый / кэш-манифест ExpiresByType "доступ плюс 0 секунд" в моем.htaccess и считаю, что это необходимо в дополнение к сгенерированным меткам времени манифеста.
Я только что наткнулся на это сам, и в духе, аналогичном предложению SimpleCoders, я бы предложил, что если вы используете Apache, вы можете сгенерировать cache.manifest, используя Server Side Includes, например:
CACHE MANIFEST
# <!--#flastmod file="index.html"-->
# <!--#flastmod file="whatever.js"-->
# <!--#flastmod file="whatever.css"-->
whatever.js
whatever.css
Таким образом, при обновлении любого из этих файлов манифест будет изменяться автоматически. Вам также может понадобиться включить включения для этого файла и отключить кэширование, например: Apache config что-то вроде:
Alias /whatever /var/www/whatever
<Directory /var/www/whatever>
Options +Includes
AddHandler server-parsed .manifest
</Directory>
CacheDisable /whatever/ihealth.manifest
Проверьте журналы сервера, чтобы убедиться, что вы возвращаете файл с "200 Okay", а не "304 Not Modified".
Манифест кеша - ужасная технология.
Браузер не кэширует манифест; вместо этого он просто не осознает, что он изменился, и это то, что вы наблюдаете. Попробуйте добавить случайный комментарий или два к вашему манифесту (добавьте комментарии с #
), а затем посмотреть, если это работает.
Простое изменение файлов, на которые ссылается манифест, не приведет к повторной загрузке манифеста браузером. Если это то, на что вы надеялись, попробуйте следующее: используйте файл PHP для генерации манифеста. Конечно, использовать header
установить правильный тип MIME. После того, как вы отобразили все ваши ресурсы, отобразите хэш метки времени всех этих ресурсов. Таким образом, если один из них будет изменен, файл манифеста изменится. Это то, что я использую:
// Collect a list of resources we need to check (customize to your needs)
$files = array(
"/scripts/script1.js",
"/scripts/script2.js",
"/scripts/script3.js",
"/scripts/script4.js",
"/css/style.css"
);
$filetime = 0;
foreach ($files as $file) {
$filetime += filemtime($file);
}
// This echoes out the hash of the filetimes as a comment
echo "#" . sha1($filetime);