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

Han*_*ank 194 caching http cache-control httpwebrequest http-status-codes

我正在使用谷歌的"Page Speed"插件来访问我的网站.

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

200 200(缓存)304

通过谷歌的"页面速度".

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

我已多次刷新页面(但尚未清除我的缓存),似乎我的favicon.ico和一些图像状态= 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(缓存)状态代码.

Ben*_*pan 214

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

另一方面,304s是服务器在浏览器检查文件是否自其缓存的最后一个版本(答案为"否")后是否被修改后的响应.

对于最佳的Web性能,您最好为所有资产设置远期Expires:Cache-Control: max-age标题,然后在需要更改资产时,更改资产的实际文件名或将版本字符串附加到该资产的请求.除非资产已从缓存中的版本明确更改(不需要304响应),否则无需进行任何请求.雅虎 有更多与缓存相关的性能指南,其中包括确保正确配置ETag.

  • 200缓存.关于此的一些好注意事项:http://developer.yahoo.com/performance/rules.html#expires.您希望资产上尽可能长的到期时间,但必须平衡这一点,即您以这种方式失去一定程度的控制权.您可以做的一件事是在文件上设置持久的过期,然后在需要时为这些文件增加资产版本号.例如,当有更改时,您可以包含style.css?v1并将<link>元素中的增量添加到style.css?v2. (21认同)
  • 如果`age`小于'max-age`,那么组合的`max-age`和`age`标头也会产生200(缓存)结果.一个例外是当用户单击浏览器刷新按钮时,在这种情况下会发送304标头. (8认同)
  • 那么,从速度的角度来看,有什么更好的...“ 200(缓存)”或“ 304” http状态消息? (2认同)
  • 正义,那么为什么 Firebug 报告 ga.js 是从本地缓存(状态 = 200 缓存)中提取的,而 combine.min.js 报告的是 304 http 状态。奇怪的是,这两个文件都属于相同的文件类型 (JavaScript) 并且位于相同的服务器目录中。你会认为两者都是 200 或 304,并没有什么不同 (2认同)
  • HTML5 Boilerplate建议不要使用缓存清除的查询字符串方法 -​​ 最好更改每个文件的`href`,`url,`和`src`引用以包含'指纹'(文件的哈希值或者简单递增的数字),然后告诉服务器剥离该指纹,只是服务`style.css`或其他什么.如果您无法在服务器上执行此操作,请让构建系统使用指纹重命名实际文件. (2认同)

Jam*_*ruk 61

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

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

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


Poo*_*och 18

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


ric*_*and 8

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

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

  • 200实际上并不意味着缓存,它只是意味着好.有可能您的服务器配置没有明确告诉浏览器缓存您的ico和js文件,这将使其返回状态代码200. (2认同)