213

我正在使用 Firefox 的 Google“Page Speed”插件来访问我的网站。

我页面上的一些组件显示为 HTTP 状态:

200 200 (缓存) 304

通过谷歌的“页面速度”。

我感到困惑的是200(缓存)和304之间的区别。

我已经多次刷新页面(但没有清除我的缓存),我的 favicon.ico 和一些图像似乎总是 status=200(缓存),而其他一些图像是 http 状态 304。

我不明白为什么会有差异。

更新

使用谷歌“页面速度”,我收到http://example.com/favicon.icohttp://cdn.example.com/js/ga.js的“200(缓存)”

但是,我收到http://cdn.example.com/js/combined.min.js的 http 状态“304”

我不明白为什么我有两个 JavaScript 文件位于同一目录 /js/ 中,一个返回 http 状态 304,另一个返回 200(缓存)状态代码。

4

5 回答 5

229

代码为“200(缓存)”的项目直接从您的浏览器缓存中完成,这意味着对项目的原始请求返回的标头表明浏览器可以缓存它们(例如,未来日期ExpiresCache-Control: max-age标头),并且在当您触发新请求时,这些缓存对象仍存储在本地缓存中并且尚未过期。

另一方面,304 是服务器在浏览器检查文件自其缓存的上一个版本以来是否被修改后的响应(答案为“否”)。

为了获得最佳的 Web 性能,您最好为所有资产设置一个遥远的未来Expires:Cache-Control: max-age标题,然后在需要更改资产时,更改资产的实际文件名或将版本字符串附加到对该资产的请求。这消除了发出任何请求的需要,除非资产已明确从缓存中的版本更改(不需要该 304 响应)。谷歌有更多关于正确使用长期缓存的细节

于 2009-11-03T03:41:27.507 回答
67

200(缓存)意味着 Firefox 只是使用本地缓存的版本。这是最快的,因为没有向 Web 服务器发出请求。

304 表示 Firefox 正在向 Web 服务器发送“If-Modified-Since”条件请求。如果自浏览器发送的日期以来该文件还没有更新,Web 服务器会返回一个 304 响应,这实际上是告诉 Firefox 使用其缓存版本。它不如 200(缓存)快,因为请求仍然发送到 Web 服务器,但服务器不必发送文件的内容。

对于您的最后一个问题,我不知道为什么同一目录中的两个 JavaScript 文件返回不同的结果。

于 2010-08-03T21:28:56.673 回答
19

这也让我很长时间。我要验证的第一件事是您没有通过单击刷新按钮重新加载页面,这将始终发出有条件的资源请求,并将为许多页面元素返回 304。而是转到 url 栏选择页面并按 Enter 键,就像您刚刚再次输入相同的 URL 一样,这将使您更好地指示正在正确缓存的内容。这篇文章很好地解释了条件请求和无条件请求之间的区别以及刷新按钮如何影响它们:http: //blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about-条件-http-requests-and-the-refresh-button.aspx

于 2013-08-30T21:22:00.417 回答
9

HTTP 304“未修改”。你的网络服务器基本上是在告诉浏览器“这个文件自你上次请求以来没有改变过”。而 HTTP 200 告诉浏览器“这是一个成功的响应” - 当您的浏览器第一次访问文件或第一次访问修改后的副本时应该返回。

有关状态代码的更多信息,请查看http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

于 2009-11-03T03:41:45.090 回答
4

对于你的最后一个问题,为什么?我会试着用我所知道的来解释

用外行的话简要解释这三个状态码。

  • 200 - 成功(浏览器请求并从服务器获取文件)

如果在服务器中启用了缓存

  • 200(来自内存缓存) - 在浏览器中找到文件,因此浏览器不会从服务器请求
  • 304 - 浏览器请求文件但被服务器拒绝

对于某些文件,浏览器决定从服务器请求,而对于某些文件,它决定从存储的(缓存的)文件中读取。为什么是这样 ?每个文件都有一个到期日期,所以

如果文件未过期,则浏览器将使用缓存(200 缓存)。

如果文件过期,浏览器会向服务器请求文件。两个地方(浏览器和服务器)的服务器检查文件。如果找到相同的文件,服务器将拒绝该请求。根据协议浏览器使用现有文件。

看看这个nginx配置

location / {
    add_header Cache-Control must-revalidate;
    expires     60;
    etag on;

    ...
}

这里将过期时间设置为 60 秒,因此所有静态文件都会缓存 60 秒。因此,如果您在 60 秒内再次请求文件,浏览器将从内存(200 内存)中读取。如果您在 60 秒后请求浏览器将请求服务器(304)。

我假设文件在 60 秒后没有更改,在这种情况下你会得到 200(即,将从服务器获取更新的文件)。

因此,如果服务器配置了不同的过期和缓存标头(策略),则状态可能会有所不同。

在您使用 cdn 的情况下,cdn 的主要目的是高可用性和快速交付。因此他们使用多个服务器。即使文件似乎在同一个目录中,cdn 也可能使用多个服务器来提供您的内容,如果这些服务器具有不同的配置。然后这些状态可以改变。希望能帮助到你。

于 2018-03-20T12:45:01.090 回答