HTML 5缓存清单自行缓存

时间:2011-05-28 12:45:36

标签: html caching html5 manifest manifest.cache

我有一个问题,似乎cache.manifest文件本身就被缓存了。这意味着(Mobile)Safari不会记录文件的每个更改,因此它永远不会更新并始终显示最后的缓存文件。

我试图在与.htaccess文件相同的目录中使用cache.manifest文件来避免它:

ExpiresActive On
ExpiresDefault "access"

这没有用,所以我在一个包含以下标题的php文件中更改了cache.manifest:

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(桌面),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 个答案:

答案 0 :(得分:3)

根据HTML5 documentation,如果应用程序缓存清单文件是逐字节的,与前一个相同,无论HTTP缓存标头是否到期等,都认为不需要更新。

在缓存清单文件的底部,您需要在文件底部包含注释,其中包含最近修改过的文件的时间戳,例如:

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

这将打破逐字节的相同性,即使文件列表保持不变,但仍会更新一些文件。

答案 1 :(得分:1)

正如在其他答案中所提到的,缓存清单是一个真正难以处理的问题。

我为我的HTML5记事本应用程序调整了一个PHP清单“构建”脚本。

测试并使用Chrome,Firefox,IE8 +,Android和iOS。

它是开源的,可在此处获取:https://github.com/JasonHanley/note5/blob/master/build.php

我还在.htaccess中使用ExpiresByType text / cache-manifest“access plus 0 seconds”,我相信除了生成的显示时间戳之外,还有必要。

答案 2 :(得分:1)

我只是stumbled onto this one myself,与SimpleCoders建议类似,我建议如果您使用Apache,您可以使用服务器端包含生成cache.manifest,例如:

CACHE MANIFEST
# <!--#flastmod file="index.html"-->
# <!--#flastmod file="whatever.js"-->
# <!--#flastmod file="whatever.css"-->
whatever.js
whatever.css

这样,无论何时更新任何文件,清单都会自动更改。您可能还需要为该文件启用包含并禁用缓存,例如:Apache配置类似于:

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”返回文件。

答案 3 :(得分:0)

缓存清单是一项糟糕的技术。

浏览器没有缓存清单;相反,它只是没有意识到它已经改变了你所观察到的。尝试在清单中添加一两个随机注释(使用#添加注释),然后查看它是否有效。

只需修改清单引用不会触发浏览器重新下载清单的文件。如果这是您所希望的,那么试试这个:使用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);