【问题标题】:Custom webserver caching自定义网络服务器缓存
【发布时间】:2010-02-26 22:05:39
【问题描述】:

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

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

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

  1. 将 ETag 与 XSL 和图像文件一起使用,使用修改后的时间和大小来生成 ETag
  2. 设置缓存控制:对 XML 和 JSON 响应不缓存

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

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

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

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

【问题讨论】:

    标签: http caching http-headers webserver embeddedwebserver


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-13
        • 2011-10-26
        • 2015-04-21
        相关资源
        最近更新 更多