1

在我的网站上,我有一些每年更新一次的谷歌地图叠加图像。所以它们是浏览器缓存的候选者。

指定缓存的最佳方法是什么?例如,如果我使用...

Header set Cache-Control "max-age=31536000, public"

(31536000 秒 = 1 年)

据我了解,这没有用,好像有人在我更新图像前一天访问该网站,那么他们将不得不等待一年才能看到正确的新图像?我可以指定图像过期的日期而不是持续时间吗?或者有没有更好的方法来处理这个?

另外,我似乎无法使正则表达式起作用。任何人都可以在我的 .htaccess 文件中看到此代码有什么问题(我想匹配特定目录中的所有 .PNG 图像)...

<FilesMatch "\/overlayDirectoty\/[^\.]+\.png$">
Header set Cache-Control "max-age=31536000, public"
</FilesMatch>

我在共享 Linux/Apache 托管 (goDaddy) 上。

更新

图像文件的平均大小为 580 字节。但是当用户平移和缩放地图时,会下载很多(总共有 12000 个)。

更新

我刚刚发现了这一点。如果我知道我最早将在每年的 1 月 1 日更新图像,这行得通吗?...

Header set Expires "Sun, 1 Jan 2014 00:00:00 GMT"

4

3 回答 3

1

在这种情况下,我会将图像设置为永不过期,但是当您更改它时,请使用不同的文件名。

于 2013-05-10T19:04:30.767 回答
0

首先,您必须考虑是否要利用使用 etag 进行重新验证。

http://en.wikipedia.org/wiki/HTTP_ETag

您可以让浏览器完全缓存图像,也可以让客户端执行仅用于验证 etag 是否仍然相同的头部请求。e 标签由 apache 使用文件修改时间、名称和大小动态计算。

换句话说:如果您的图像发生变化,其电子标签也会发生变化。

如果 e-tag 没有改变,客户端使用 cacehd 版本并且不下载文件。

但是,您将有一个头部请求的开销,这是最小的,我会推荐这种方法。

尽管如此,为了完整起见,让我们讨论其他可能性:

  • 更改文件名

当文件名更改时,浏览器将重新获取它。一种常见的做法是将所谓的“cachebreaker”作为查询字符串附加到文件中。如果您在 php 中生成 src url,只需附加修改时间戳之类的内容,这样 url 看起来像

image.jpg?UNIX_TIMESTAMP

  • 使用在您选择时过期的缓存规则

我认为这不好维护,因为您将自己固定为刷新图像的时间,而以前则不能。但是,更改文件名始终是作为“最后手段”的一种措施。

您可以使用脚本语言动态设置标头并计算它,但是这不如使用网络服务器交付的性能好。还有像 mod_xsendfile 这样的组合,但这对您的需求来说绝对是多余的。

不,我认为你没有看到更大的图景。

mod_expires 允许您根据当前时间(访问)或文件修改来指定缓存生命周期。如果您确保文件修改时间正确,只需将其设置为参考即可。

在这里阅读:

http://httpd.apache.org/docs/2.4/mod/mod_expires.html

但你真正能做的是,只需编写代码!

它只是一个你知道的标题,没有人强迫你使用 mod 过期。

只需使用 mod_headers 手动设置标题!

在这里阅读:

http://httpd.apache.org/docs/2.4/mod/mod_headers.html

我不会用例子来说明这一点,因为我真的认为你应该使用 etag。

于 2013-05-10T19:25:47.790 回答
0

我不确定你是否需要做任何事情。

Apache 是否已经用Last-modified标头响应?(对于静态png文件应该是。)如果是这样,那么浏览器应该发送一个If-modified-since包含所有后续请求的标头;这将导致您的服务器回复 HTTP 304,而不是实际重新发送图像。(ETag标题的作用类似。)

当您更新文件时(每年一次),文件更新时间会发生变化,所有后续请求都将获得新版本的 png 文件。

这种方法的缺点是每个浏览器仍然会针对它尝试呈现的每个图像向您的服务器发出请求——因此您会在日志中看到许多 304。但是与多千字节的图像文件相比,304 流量(通常)非常少。

于 2013-05-10T19:13:47.077 回答