2011-05-28 112 views
3

我有一个问题,看起来cache.manifest文件获取缓存本身。这意味着(移动)Safari不会记录对文件所做的每一项更改,因此它永远不会更新并始终显示上次缓存的文件。HTML 5高速缓存清单获取缓存本身

我试图避免使用.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浏览器(桌面),铬(三星Galaxy Tab 10.1),火狐
失败的:的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和REFR内的修订注释在Safari(iOS)上激活它仍然会显示旧文件。我无能为力。

回答

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); 
+5

你现在对于缓存清单有点讨伐,不是吗? :p – Stoive 2011-06-30 01:11:58

+1

哈哈,是的。我发布了我的问题,但后来变得太急于等待答复,所以我开始考虑“相关问题”。 – 2011-06-30 01:16:38

3

按照HTML5 documentation,如果一个应用程序缓存清单文件是字节为字节一样一前一,无论/ HTTP缓存头的到期等,它被认为不需要更新。

在您的缓存清单文件的底部,你需要包括在与最近修改文件的时间戳的文件底部的评论,如:

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

这将打破字节即使文件列表保持不变,但少数文件被更新,字节之间的相同性也是如此。

+0

这解决了我的问题..谢谢。我也需要把这条线和CACHE MANIFEST#2014-06-09 v1.2.0都? – astroanu 2014-06-09 12:00:38

1

正如其他答案中所暗示的那样,缓存清单是一个真正需要解决的问题。

我调整了我的HTML5记事本应用程序的PHP清单“build”脚本。

经过测试并在Chrome,Firefox,IE8 +,Android和iOS上工作。

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

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

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好”返回文件而不是“304未修改”。