ETags:验证和缓存max-age

时间:2015-12-24 05:14:38

标签: validation http-headers etag http-caching

我一直在使用ETags很长一段时间,我对它们如何被使用以及它们允许完成的内容感到兴奋。

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

一旦聪明的网络服务器(我在NodeJS中编码我的网站服务器)如​​何能够避免在cache-control: max-age=N进行验证时被点击?

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

2 个答案:

答案 0 :(得分:2)

我在我的端点上断断续续地问题(Ubuntu下的FF45)。每次重新加载都会检查一些文件,而大多数文件都没有。我不太清楚什么会告诉Firefox应该在每次加载时检查这样或那样的文件。

根据jscher2000在a blog上的帖子,Firefox首先检查Last-Modified,如果过期,则发送请求;请求包含ETag中服务器If-None-Match的值,我还可以看到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: ...

副本" Keep-Alive"在Connection中来自Apache。

答案 1 :(得分:1)

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

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

如果你的缓存控制头设置正确,那么这些请求应该是不常见的,并且规范应该是不发送请求的。