0

我正在使用嵌入式系统上的自定义网络服务器,并且在正确设置我的 HTTP 标头以进行缓存时遇到了一些问题。

我们的网络服务器将所有动态内容生成为 XML,并且我们使用半静态 XSL 文件来显示它,其中包含一些动态 JSON 请求以及半静态图像。我说“半静态”是因为当我们需要进行固件更新时会出现问题,这可能会更改 XSL 和图像文件。

以下是需要做的事情:缓存 XSL 和图像文件,不缓存 XML 和 JSON 响应。我可以完全控制 HTTP 响应,目前:

  1. 将 ETag 与 XSL 和图像文件一起使用,使用修改后的时间和大小来生成 ETag
  2. 在 XML 和 JSON 响应中设置 Cache-Control: no-cache

正如我所说,在固件更新之前,当 XSL 和图像文件有时被缓存时,一切正常。我已经看到它在最新版本的 Firefox 和 Safari 上运行良好,但在 IE 上遇到了一些问题。

我知道解决这个问题的一种方法是在每个版本之后简单地重命名 XSL 和图像文件(例如 logo-v1.1.png、logo-v1.2.png)并将 Expires 标头设置为将来的日期,但是这对于 XSL 文件来说会很困难,我想避免这种情况。

注意:设备上有一个时钟,但需要用户设置它,并且可能不是 100% 可靠的,这可能导致我在使用 ETags 时出现缓存问题。

我应该采用的最佳做法是什么?我想避免尽可能多的网络服务器请求,但在软件更新后使旧的 XSL 和图像文件失效是第一要务。

4

2 回答 2

0

我们在做同一个项目吗?我走了很多死胡同,找出处理这个问题的最佳方法。

我将 .html 和 .shtml 文件(动态 JSON 数据)设置为立即过期。("Cache-Control: no-cache\r\nExpires: -1\r\n") 其他所有内容都设置为 10 年后到期。("缓存控制: max-age=290304000\r\n")

我的 makefile 对所有 .html 文件运行 perl 脚本,并识别您所谓的“半静态”内容(图像、javascript、css)。然后该脚本对这些文件运行 md5 校验和并将校验和附加到文件中:

<script type="text/Javascript" src="js/all.js?7f26be24ed2d05e7d0b844351e3a49b1">

问号之后的所有内容都将被忽略,但除非引号之间的所有内容都匹配,否则没有浏览器会缓存它。

我使用 all.js 和 all.css,因为所有内容都使用相同的脚本组合和缩小。

出于好奇,您使用的是什么嵌入式网络服务器?

于 2010-04-27T23:52:31.427 回答
0

试试Cache-Control: no-storeno-cache告诉客户端可以缓存响应;除非缓存无法联系原始服务器,否则它通常不会被重用。

顺便说一句,单独设置 ETag 不会使响应可缓存;你还应该设置Cache-Control: max-age=nnn.

您可以通过http://redbot.org/查看您的回复将如何处理

于 2010-04-30T06:43:02.323 回答