HTML 5 Cache манифест получает само кешируется - PullRequest
4 голосов
/ 28 мая 2011

У меня проблема в том, что кажется, что файл 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 ]

3 голосов
/ 30 июня 2011

Согласно документации HTML5 , если файл манифеста кэша приложения является побайтовым, как и предыдущий, независимо от заголовков кэша HTTP для срока действия / etc, считается, что он не требует обновление.

В нижней части файла манифеста кеша необходимо добавить комментарий внизу файла с отметкой времени последнего измененного файла, например ::

.
# last modified: Thu, 30 Jun 2011 01:19:46 GMT

Это нарушит байтовую идентичность, даже если список файлов останется прежним, но некоторые из них будут обновлены.

1 голос
/ 22 сентября 2011

Я только что наткнулся на него сам , и в том же духе, что и в SimpleCoders, я хотел бы предложить, что если вы используете Apache, вы можете сгенерировать cache.manifest с помощью Server Side Include, например:

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 не изменен».

1 голос
/ 04 июля 2011

Как упоминалось в других ответах, манифесты кеша - настоящая боль, с которой приходится иметь дело.

Я настроил скрипт "build" манифеста PHP для моего приложения для блокнота HTML5.

Протестировано и работает на Chrome, Firefox, IE8 +, Android и iOS.

Это открытый исходный код и доступен здесь: https://github.com/JasonHanley/note5/blob/master/build.php

Я также использую текстовый / кэш-манифест ExpiresByType «доступ плюс 0 секунд» в моем .htaccess, и я считаю, что это необходимо в дополнение к сгенерированным временным меткам манифеста.

0 голосов
/ 30 июня 2011

Манифест кэша - ужасная технология.

Браузер не кэширует манифест;вместо этого он просто не осознает, что он изменился, и это то, что вы наблюдаете.Попробуйте добавить случайный комментарий или два к вашему манифесту (добавьте комментарии к #), а затем посмотрите, работает ли он.

Простое изменение файлов, на которые ссылается манифест, не приведет к повторной загрузке манифеста браузером.Если это то, на что вы надеялись, попробуйте следующее: Используйте файл 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);
...