8

这与尚未回答的 SO 问题基本相同:Offline Web App not caching on Firefox but ok on Chrome

我遇到了同样的问题,我将提供更多信息,因为它可能会帮助试图找出试图实现缓存清单的神秘奥秘和陷阱的人。

问题:点击页面重新加载/刷新,页面应该从离线缓存重新加载,但事实并非如此。

它在 Chrome 23 中运行良好:当我断开与 Internet 的连接并刷新页面时,它加载正常并且控制台显示 Application Cache NoUpdate 事件。

但是,Firefox 15.0.1 显示了我的 404 页面。

故障排除 (Firefox):转到 Firebug 并单击 DOM,然后单击 applicationCache。状态显示为 0,表示未缓存(页面尚未离线存储)。

故障排除 (Firefox):转到 Firefox 选项 -> 高级并查看离线 Web 内容和用户数据。它显示我的域正在使用 1.4MB 的数据供离线使用。(这是检查您的页面是否已被缓存的好地方)。

故障排除 (Firefox):打开一个新选项卡并转到 about:cache。在这里,您应该会看到离线缓存设备的标题。在这里您可以看到缓存目录,这是您的离线缓存文件的保存位置。如果您单击 List Cache Entries,您将在离线缓存清单中看到这些文件。

这里有两件事我觉得很奇怪:1)当我点击列表中的任何文件时,它会转到一个空白页面,上面写着“缓存条目信息您选择的缓存条目不可用”。但是,缓存目录中的文件确实存在并且不是空白 2)虽然列出了缓存清单中的所有文件,但我正在调用的页面未在此处列出(在 Chrome DevTools 中,它在清单中显示为Master:它会自动缓存,即使它没有在缓存清单文件中明确列出)。

这是我在线时看到的内容: 使用冷(空)缓存,当我加载页面时,控制台会显示检查、下载、进度和缓存事件,但缓存状态为未缓存。基本上,缓存文件已下载,但无法访问。Firebug DOM applicationCache 说:离线缓存中有 0 个项目(这与 about:cache 和 Options -> Advanced 中显示的内容相矛盾)。状态为 1,表示空闲。当我在线查看 Firebug 中的 Net 选项卡时,它会显示对页面的 GET 请求,响应为 200 OK。Expires 设置显示 Wed Dec 31 1969,我认为这意味着该页面将始终被获取。其他文件显示 304 Not Modified 响应,这意味着它们正在从浏览器缓存中加载,

当我离线时:使用“未缓存”缓存,GET 请求会失败,它会加载带有 200 OK (BFCache) 响应的离线回退 404 页面。

似乎下载了离线缓存,因为它物理存在于磁盘上,并且控制台中显示了进度事件,但 Firefox 从未触发缓存事件,因此某些资源没有成功下载。这些文件都是 png、js 或 php 格式,所以没有疯狂的文件格式。Chrome 可以毫无问题地将完全相同的文件下载到缓存中。我也尝试过移动 Safari,它成功地从离线缓存重新加载了页面。

Firefox 是否存在不缓存某些文件类型的已知问题?我在我的一些文件上使用了 .html.php 扩展名。我还使用 php 文件动态生成清单,因此它只获取存在的文件并将它们散列以检测更改并更新清单。

下一步:我将尝试一个简单的清单,看看我是否可以让它工作,然后一个一个添加文件,看看哪个文件触发了错误。也许 Firefox 不喜欢我动态生成缓存清单而不是手动更新静态文件的事实?

我学到了很多关于缓存清单的奥术复杂性,但我更像是一个黑客而不是计算机专家。有没有其他人在使用 Firefox 时遇到过这种怪癖?

页面开头:

<!DOCTYPE html> 
<html manifest="/directory/manifest.php"> 

然后 manifest.php 就是

header('Content-Type: text/cache-manifest');
echo "CACHE MANIFEST\n";

等等等等。它使用 RecursiveDirectoryIterator 来获取目录中的所有文件(除了缓存本身,它默认包含)。

4

0 回答 0