2010-02-26 101 views
0

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

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

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

  1. 使用与XSL和图像文件的ETag,使用修改时间和大小来生成ETag的
  2. 设置的Cache-Control:在无缓存XML和JSON响应

正如我所说的,一切当XSL和图像文件有时缓存工作花花公子,直到固件更新。我已经看到它与最新版本的Firefox和Safari一起工作良好,但IE浏览器遇到了一些问题。

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

注意:单元上有一个时钟,但需要用户进行设置,并且可能不是100%可靠,这可能会导致使用ETags时出现缓存问题。

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

回答

0

我们正在研究同一个项目吗?我找到了处理这个问题的最佳方法,并且走了很多死路。

我将我的.html和我的.shtml文件(动态JSON数据)立即过期。 (“Cache-Control:no-cache \ r \ nExpires:-1 \ r \ n”) 其他设置在10年内过期。 (“Cache-Control:max-age = 290304000 \ r \ n”)

我的makefile在所有的.html文件上运行perl脚本,并标识出你称之为“半静态”的内容(images,javascript,css 。)然后,该脚本运行这些文件md5校验和追加校验文件:问号后

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

一切都被忽略,但除非引号之间的一切不匹配的浏览器会缓存它。

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

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

0

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

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

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