HTML 5缓存清单自身已缓存

问题描述 投票:4回答: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'); 

任何人对于如何确保在可能的情况下都可以检索缓存文件本身有其他想法?

Works on: Safari(桌面),Chrome(三星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)上刷新它,它仍会显示旧文件。我一无所知。

caching html manifest manifest.cache
4个回答
3
投票

根据HTML5 documentation,如果应用程序高速缓存清单文件与前一个字节逐字节相同,则不管HTTP高速缓存标头是否到期,都将其视为不需要更新。

在缓存清单文件的底部,您需要在文件的底部添加注释,并带有最近修改的文件的时间戳,例如:

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

即使文件列表保持相同,但其中一些已更新,这也会破坏字节对字节的相同性。


1
投票

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

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

在Chrome,Firefox,IE8 +,Android和iOS上经过测试并可以使用。

它是开源的,可以在这里找到:https://github.com/JasonHanley/note5/blob/master/build.php

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


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 config like:

Alias /whatever /var/www/whatever
<Directory /var/www/whatever>
     Options +Includes
     AddHandler server-parsed .manifest
</Directory>
CacheDisable /whatever/ihealth.manifest

检查您的服务器日志,以确保您返回的文件是“ 200 OK”,而不是“ 304 Not Modified”。


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);
© www.soinside.com 2019 - 2024. All rights reserved.