【问题标题】:ETags: Validation and Cache max-ageETags:验证和缓存最大年龄
【发布时间】:2016-03-30 14:11:57
【问题描述】:

我已经使用 ETags 有一段时间了,我对它们的使用方式和允许完成的操作感到满意。

但是,我有时会遇到 ETag 验证请求。在我的服务器上,我可以看到我的浏览器点击了资源 URL,然后得到了“未更改”响应。但是,这仍然是一个请求。

只要cache-control: max-age=N 运行,一个聪明的网络服务器(我正在用 NodeJS 编写我的代码)如何避免被验证击中?

例如,我的max-age 表示 TTL 为 30 天。客户根本不应该在那个时候验证 Etag。这可能吗?

【问题讨论】:

    标签: validation http-headers etag http-caching


    【解决方案1】:

    间歇性地看到了这个问题(Ubuntu 下的 FF45)。每次重新加载时都会检查一些文件,而大多数文件不会。我不太确定什么会告诉 Firefox 在每次加载时都应该检查这样或那样的文件。

    根据 jscher2000 在a blog 上的帖子,Firefox 首先检查 Last-Modified,如果过期,则发送请求;请求将在If-None-Match 中包含服务器ETag 的值,我还可以看到If-Modified-Since 标头。

    一般来说,Firefox 不会重新请求或重新验证尚未过期的缓存文件。您可以通过更改 about:config 中的设置来更改 Firefox 在客户端的行为(显然您需要清除缓存并重新启动 Firefox 才能使更改生效):

    browser.cache.check_doc_frequency(默认为过期后) browser.cache.check_doc_frequency not working? @ mozillaZine Forums(清除缓存/重启)

    看起来我的check_doc_frequency 参数设置为 3,这意味着它应该仅在文档被认为已过期时才检查它们。

    可能的值及其影响

    0 - 每个会话检查一次页面的新版本(会话在第一个应用程序窗口打开时开始,在最后一个应用程序窗口关闭时结束)。
    1 — 每次加载页面时检查新版本。
    2 — 从不检查新版本 - 始终从缓存中加载页面。
    3 — 当页面过期时检查新版本。 (默认)

    我做的一件事是我使用以下两个标题:

    Cache-Control: max-age=3600
    Expires: Sun, Mar 27 2016 21:13:50
    

    可能存在某种混淆,如果只定义了max-age,那么您会在一些奇怪的情况下运行并错过该特定情况。

    以防万一,有我的完整标题:

    Cache-Control: max-age=3600,public
    Connection: keep-alive, Keep-Alive
    Date: Mon, 28 Mar 2016 02:56:20 GMT
    Etag: 6b395ccb5b0a913f1828cce3e2756bdc
    Expires: Mon, 28 Mar 2016 03:56:19 GMT
    Keep-Alive: timeout=15, max=5
    Server: Apache
    Set-Cookie: ...
    

    Connection 字段中重复的Keep-Alive 值来自 Apache。

    【讨论】:

      【解决方案2】:

      无法在服务器级别强制执行此操作,因为这是由客户端决定的。

      像 ETag 这样的缓存控制标头是提示而不是指令。浏览器可以随意忽略这些提示(例如,当您刷新页面时,您明确要求浏览器重新检查资源)。一些浏览器还会定期重新检查资源。

      也就是说,如果您的缓存控制标头设置正确,那么这些请求应该不常见,并且标准应该是不发送请求。

      【讨论】:

      • 好的。看起来我无能为力,除了提供更多提示 - appcache 等。感谢您的提醒(:
      • 你还需要记住,浏览器缓存不是无限的,东西会被推出(尽管在这种情况下你不应该得到 304 - 没有修改的响应,因为浏览器不会有原来的下载或 Etag 了)。事实上,浏览器缓存比您想象的要小得多,尤其是在移动设备上:guypo.com/mobile-browser-cache-sizes-round-2
      猜你喜欢
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多