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


201

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

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

200200(缓存)304

由谷歌的“ Page Speed”。

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

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

我不明白为什么会有所不同。

更新

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

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

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

Answers:


220

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

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

为了获得最佳的Web性能,最好为所有资产设置一个远期Expires:Cache-Control: max-age标头,然后在需要更改资产时,更改资产的实际文件名或在该资产的请求后附加版本字符串。这消除了对任何请求的需求,除非资产确实已从缓存中的版本进行了更改(不需要该304响应)。Google提供了有关正确使用长期缓存的更多详细信息


2
那么,从速度的角度来看,有什么更好的...“ 200(缓存)”或“ 304” http状态消息?
汉克,

22
200个缓存。有关此的一些注意事项:developer.yahoo.com/performance/rules.html#expires。您希望资产拥有尽可能长的到期时间,但必须以此来平衡您失去某种控制权这一事实。您可以做的一件事是在文件上设置持久期限,然后在需要时增加这些文件的资产版本号。例如,您可以包含style.css?v1,并在发生更改时将<link>元素中的增量添加到style.css?v2。
本·雷根斯潘09年

1
正义,为什么Firebug会报告ga.js是从本地缓存(状态= 200缓存)中提取的,而Combined.min.js报告的是304 http状态。奇怪的是,这两个文件属于同一文件类型(JavaScript),并且位于同一服务器目录中。您会认为两者都是200或304,并且没有什么不同
Hank 2009年

8
如果小于,则max-ageage标头的组合也可以得到200个(缓存)结果。一个例外是当用户单击浏览器刷新按钮时,在这种情况下,将发送304标头。agemax-age
yitwail 2012年

2
HTML5样板建议不要使用缓存清除的查询字符串方法-这是更好的改变hrefurl,src给每个文件引用到包括“指纹”(无论是文件的哈希或简单的递增数),然后告诉服务器剥去那个指纹,然后任其style.css食用。如果无法在服务器上执行此操作,请让构建系统使用指纹重命名实际文件。
iono

62

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

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

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


18

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


1
我什至无法描述我花了多少时间试图找出对CDN的304个请求状态。尽管您回答了一个不同的问题,但您应该得到赏金:-)
Peeech

您是对的:代码中的差异与您正在重新加载页面或页面不同有关。如果重新加载页面,则会在浏览器的网络监视器中看到304代码。但是,如果我访问另一个使用相同文件的URL,则在浏览器的网络监视器中会看到200(来自缓存)代码。基本上相同)。
aldemarcalazans

8

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

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


这也是我的理解……这就是为什么我在原始帖子中说我多次刷新了页面,但仍然为相同的favicon.ico(包括我拥有的特定JavaScript)获得“ 200(缓存)”。非常奇怪
Hank,2009年

2
200实际上并不意味着已缓存,而是意味着可以。有可能你的服务器配置没有明确告知浏览器缓存您的ICO和js文件,这将使其返回200状态码
richleland

在某些JavaScript中,b / c并非如此,我收到304,而其他JavaScript则得到“ 200(缓存)”。所有JavaScript都驻留在同一Web服务器目录example.com/js/中
Hank

我应该添加200(缓存)只是意味着它是本地缓存的,实际上并没有向服务器发出请求,这比去服务器并获得304响应要快。
里奇兰

我已经更新了原始帖子,以显示我的实时网站和有问题的JavaScript。请参阅我更新的原始帖子。
汉克,

2

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

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

  • 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内容。然后,这些状态可以更改。希望能帮助到你。


304-未修改不是服务器的“拒绝”。它是服务器向客户端声明“对于您要的版本,我知道它没有被修改,您实际上不需要该文件”。从技术上讲,304是“重定向”响应代码之一。它告诉客户端“从您自己的缓存中获取”。
Bob Kuhar,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.