![为什么尽管 HTTP 资源显示为“已缓存”,Firefox 仍然会连接到服务器?](https://linux22.com/image/755575/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%B0%BD%E7%AE%A1%20HTTP%20%E8%B5%84%E6%BA%90%E6%98%BE%E7%A4%BA%E4%B8%BA%E2%80%9C%E5%B7%B2%E7%BC%93%E5%AD%98%E2%80%9D%EF%BC%8CFirefox%20%E4%BB%8D%E7%84%B6%E4%BC%9A%E8%BF%9E%E6%8E%A5%E5%88%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%9F.png)
Firefox 显示已加载资源的方式让我感到困惑,cached
但随后我可以看到浏览器针对域名发出新的 DNS 查询并再次联系 HTTP 服务器。
下面是此行为的一个简单示例。我访问了https://example.com然后重新加载网页。正如预期的那样,加载的资源显示为cached
。但与此同时,我在后台运行 tcpdump 并注意到浏览器example.com
再次发出 DNS 查询,并在获得 DNS 响应后连接到 HTTP 服务器。
答案1
Firefox 已缓存您的对象,并且重新验证对象与原始服务器。您可以判断这一点,因为它发送了If-Modified-Since:
和Cache-Control:
请求标头。
Firefox 通常会在两种情况下重新验证缓存对象:
- 缓存的对象已过时,这是由上次缓存该对象时随其发送的
Cache-Control:
和响应标头决定的。Expires:
- 您点击了“重新加载”。
您可以看到 Web 服务器发送了304 Not Modified
响应,因此 Firefox 提供了现有的缓存对象。
HTTP 缓存可能非常复杂。要了解所有相关内容,请花一个晚上学习RFC 7234。