为什么这个HTTP头配置会导致浏览器总是执行If-Modified-Since请求?

为什么这个HTTP头配置会导致浏览器总是执行If-Modified-Since请求?

在我们的服务器上,我们配置了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

我们的目的是让浏览器缓存资源 8 小时,之后浏览器应该304在使用缓存副本之前检查它是否已被修改(通过请求)。

然而,我发现浏览器总是制作一个304。(它继续使用它的缓存副本,但在执行此操作之前会检查服务器是否有修改 - 我希望这在 8 小时后发生,而不是一直发生。)

我认为它应该起作用,Cache-Control:max-age=28800, must-revalidate应该指示客户端使用缓存的资源,直到它到达max-age缓存中,之后它must-revalidate与原始服务器一起使用。我相信该Expires指令更像是一种后备,而Cache-Control取代则是——但如果它在实际应用中,我期望浏览器使用缓存副本直到过期日期,然后获取新副本。其中大部分内容来自这篇文章,并稍微仔细阅读一下规范。

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

编辑:我错误地认为,通过刷新当前页面,我可以测试当浏览器转到链接了相同资源的后续页面时会发生什么。我错了——点击“刷新”按钮通常会强制浏览器查看如果在使用缓存副本之前任何资源被修改了,这是显而易见的。当我点击进入其他页面时,资源会按照预期直接从缓存中提取。

答案1

这是浏览器重新加载按钮特有的期望行为。重新加载按钮将尝试验证页面和一些内容(如 CSS)。

还有其他方式可以加载页面,例如离开并返回。或者单击 URL 栏并单击“输入”,在这些情况下,浏览器将使用缓存的数据而不进行重新验证。

相关内容