为什么此HTTP头configuration会导致浏览器始终执行If-Modified-Since请求?

在我们的服务器上,我们已经configuration了http响应头,如下所示:

Cache-Control:max-age=28800, must-revalidate # (8 hours) Connection:Keep-Alive Date:Wed, 24 Apr 2013 21:36:19 GMT ETag:W/"173520-1366833451000" Expires:Thu, 25 Apr 2013 05:36:19 GMT # (8 hours from access) Keep-Alive:timeout=15, max=484 Server:Apache-Coyote/1.1 Vary:Accept-Encoding,User-Agent 

我们的意图是资源被浏览器caching8个小时,然后浏览器在使用caching副本之前应该检查它是否被修改过(有304请求)。

不过,我发现浏览器总是做一个304 。 (它继续使用它的caching副本,但在此之前检查服务器是否有修改 – 我想在8小时后发生,而不是所有的时间。

正如我认为它应该工作, Cache-Control:max-age=28800, must-revalidate应该指示客户端使用caching的资源,直到它在caching中达到max-age ,之后它must-revalidate与原始服务器must-revalidate 。 我相信Expires指令更像是一个后备,而Cache-Control取代了 – 但是如果它在起作用,我希望浏览器在到期date之前使用caching副本,然后获取新的副本。 大部分是从这篇文章中收集的,仔细阅读规范。

显然,我的理解是不完整的 – 我错过了什么?

编辑:我错误地认为通过刷新当前页面,我将testing当浏览器转到具有相同资源链接的后续页面时会发生什么。 我错了 – 点击“刷新”button通常似乎强制浏览器检查在使用caching副本之前是否有任何资源已被修改, 这非常明显 。 当我点击到其他页面时,资源就像预期的那样直接从caching中取出。

这是专门为浏览器重新加载button所需的行为。 重新加载button将尝试validation页面,以及一些像CSS这样的内容。

还有其他的方式来加载您的网页,如导航离开和返回。 或者点击url栏并在这些情况下点击“确定”,浏览器将会使用caching的数据而不重新validation。