我一直在使用ETags很长一段时间,我对它们如何被使用以及它们允许完成的内容感到兴奋。
但是,我有时会遇到ETag验证请求。在我的服务器上,我可以看到我的浏览器访问资源URL,然后得到"未更改"响应。但是,它仍然是一个请求。
一旦聪明的网络服务器(我在NodeJS中编码我的网站服务器)如何能够避免在cache-control: max-age=N
进行验证时被点击?
例如,我的max-age
表示TTL为30天。客户端根本不应该在那个时间验证Etag。这可能吗?
答案 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这样的缓存控制标头是提示而不是指令。浏览器可以忽略这些提示(例如,当您刷新页面时,您明确要求浏览器重新检查资源)。有些浏览器还会定期重新检查资源。
如果你的缓存控制头设置正确,那么这些请求应该是不常见的,并且规范应该是不发送请求的。