Validation ETags:验证和缓存最大年龄

Validation ETags:验证和缓存最大年龄,validation,http-headers,etag,http-caching,Validation,Http Headers,Etag,Http Caching,我已经使用ETag很长一段时间了,我很高兴它们可以被如何使用以及它们允许做什么 但是,我有时会遇到ETag验证请求。在我的服务器上,我可以看到我的浏览器点击了资源URL,然后得到“未更改”的响应。但是,这仍然是一个请求 只要缓存控制:max age=N运行,一个聪明的Web服务器(我正在NodeJS中编写我的代码)如何避免被验证击中 例如,mymax age表示TTL为30天。客户机根本不应该在那时验证Etag。这可能吗?不可能在服务器级别强制执行此操作,因为这是由客户端决定的 像ETag这样的

我已经使用ETag很长一段时间了,我很高兴它们可以被如何使用以及它们允许做什么

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

只要
缓存控制:max age=N
运行,一个聪明的Web服务器(我正在NodeJS中编写我的代码)如何避免被验证击中


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

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

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

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

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

根据jscher2000上的一篇帖子,Firefox首先检查最后修改的内容,如果已经过时,则发送请求;请求,该请求将在
中包含服务器
ETag
的值,如果没有匹配的
,我还可以看到
(如果自
头修改)

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

(默认为到期后) (清除缓存/重新启动)

看起来我的
check\u doc\u 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。

OK。看起来除了提供更多提示之外,我什么也做不了,比如appcache等。感谢大家的提醒(:你还需要记住,浏览器缓存不是无限的,东西会从中被挤出(尽管在这种情况下,你不应该得到304-not modified响应,因为浏览器不再有原始下载或Etag)。事实上,浏览器缓存比您想象的要小得多,尤其是在移动设备上: