HTTP状态代码200(缓存)与状态代码304之间有什么区别?

时间:2009-11-03 03:34:06

标签: http caching httpwebrequest http-status-codes cache-control

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

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

200 200(缓存) 304

谷歌的“Page Speed”。

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

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

我不明白为什么不同。

更新

使用Google“Page Speed”,我收到http://example.com/favicon.ico的“200(缓存)”以及http://cdn.example.com/js/ga.js

但是,我收到http://cdn.example.com/js/combined.min.js

的http状态“304”

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

6 个答案:

答案 0 :(得分:214)

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

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

为了获得最佳的网络效果,您最好为所有资产设置远期Expires:Cache-Control: max-age标头,然后在需要更改资产时,更改实际的文件名资产或将版本字符串附加到该资产的请求。除非资产已从缓存中的版本明确更改(不需要304响应),否则无需进行任何请求。雅虎具有more cache-related performance guidelines,其中包括确保正确配置ETag。

答案 1 :(得分:61)

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

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

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

答案 2 :(得分:18)

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

答案 3 :(得分:8)

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

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

答案 4 :(得分:2)

304未经修改。我在我的媒体文件如css和js中获得了很多代码。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5

答案 5 :(得分:1)

对于你的上一个问题,为什么?我会尝试解释我所知道的事情

以外行人的术语简要解释这三个状态代码。

  • 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可能会使用多个服务器来提供u内容。然后这些状态可能会改变。希望它有所帮助。