4

我有一个问题,似乎 cache.manifest 文件自己被缓存了。这意味着(移动)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

4 回答 4

3

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

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

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

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

于 2011-06-30T01:20:32.863 回答
1

我自己刚刚偶然发现了这个,并且与 SimpleCoders 的建议类似,我建议如果您使用 Apache,您可以使用服务器端包含生成 cache.manifest,例如:

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 好的”而不是“304 未修改”。

于 2011-09-22T03:59:17.110 回答
1

正如在其他答案中提到的那样,缓存清单是一个真正的痛苦处理。

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

在 Chrome、Firefox、IE8+、Android 和 iOS 上测试并运行。

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

我还在我的 .htaccess 中使用 ExpiresByType 文本/缓存清单“访问加 0 秒”,我相信除了生成的清单时间戳之外,这是必要的。

于 2011-07-03T21:53:30.633 回答
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);
于 2011-06-30T00:34:09.287 回答