22

我在应用程序中使用的文件夹中有很多图像。使用缓存清单时,如果我可以指定一个通配符来加载某个目录中要缓存的所有图像或文件,那么维护起来会更容易。

例如

CACHE MANIFEST
# 2011-11-3-v0.1.8
#--------------------------------
# Pages
#--------------------------------
../index.html
../edit.html
#--------------------------------
# JavaScript
#--------------------------------
../js/jquery.js
../js/main.js
#--------------------------------
# Images
#--------------------------------
../img/*.png

这可以做到吗?已经在一些浏览器中尝试过,../img/*但它似乎不起作用。

4

5 回答 5

22

这会更容易,但它是如何工作的?清单文件是在浏览器中解析和操作的东西,除了您告诉它的内容之外,它对您服务器上的文件没有特殊的了解。如果浏览器看到这个:

../img/*.png

浏览器应该从服务器请求的第一张图片是什么?让我们从这些开始:

../img/1.png
../img/2.png
../img/3.png
../img/4.png
...
../img/2147483647.png

这就是所有可能以数字名称存在的图像,在2 31 -1处半任意停止。你的目录中有多少这 20 亿个文件img?你真的希望浏览器发出所有这些请求只是为了获得 20 亿个 404 吗?为了完整起见,浏览器可能还想请求所有的零填充等价物:

../img/01.png
../img/02.png
../img/03.png
../img/04.png
...
../img/001.png
../img/002.png
../img/003.png
../img/004.png
...
../img/0001.png
../img/0002.png
../img/0003.png
../img/0004.png
...

现在,浏览器对大多数不存在的文件发出了超过 40 亿次 HTTP 请求,而且在构建服务器上可能存在的可能文件名时,它甚至还没有考虑到字母或标点符号。这不是清单文件工作的可行方式。服务器是img已知目录中文件的位置,因此必须在服务器上构建文件列表。

于 2011-11-04T12:29:13.193 回答
17

我不认为它是这样工作的。您必须一一指定所有图像,或者使用一个简单的 PHP 脚本来遍历目录并输出文件(text/cache-manifest当然要使用正确的标题)。

于 2011-11-03T20:31:51.483 回答
3

如果浏览器可以请求文件夹列表,这将是一个很大的安全问题——这就是 Tomcat 现在默认关闭该功能的原因。

但是,浏览器可以将所有匹配项定位到它缓存的页面引用的通配符。这种方法仍然存在问题(例如,最初没有使用但由 JavaScript 动态设置的图像会怎样,并且它要求不仅下载所有缓存的项目,还需要对其进行解析)。

于 2012-05-15T17:02:09.777 回答
2

如果您尝试自动执行此过程,而不是手动执行。使用脚本,或者像我一样使用manifestR。它将输出您的清单/应用程序缓存文件,您所要做的就是复制和粘贴。我已经成功使用它,通常只需要进行一些更改。

另外,我建议使用带有通配符的网络标头:

NETWORK:
*

例如,这允许来自其他链接域的所有资产通过 JSON 下载到缓存中。我相信这是您可以指定通配符的唯一标头。就像其他人在这里所说的那样,这是出于安全原因。

于 2012-11-09T18:53:34.917 回答
0

缓存清单现在已弃用,您应该使用 HTML 标头来控制缓存。

例如:

<meta http-equiv="Cache-control" content="public">
  • 公共 - 可以缓存在公共共享缓存中。
  • Private - 只能缓存在私有缓存中。
  • No-Cache - 可能不被缓存。
  • No-Store - 可以缓存但不存档。
于 2017-04-14T20:23:39.560 回答