HTTP 状态码 200(缓存)与状态码 304 有啥区别?

     2023-03-16     184

关键词:

【中文标题】HTTP 状态码 200(缓存)与状态码 304 有啥区别?【英文标题】:What is the difference between HTTP status code 200 (cache) vs status code 304?HTTP 状态码 200(缓存)与状态码 304 有什么区别? 【发布时间】:2010-12-12 12:18:46 【问题描述】:

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

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

200 200(缓存) 304

通过 Google 的“页面速度”。

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

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

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

更新

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

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

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

【问题讨论】:

【参考方案1】:

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

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

为了获得最佳的网络性能,您最好为所有资产设置一个遥远的未来 Expires:Cache-Control: max-age 标头,然后在需要更改资产时,更改资产的实际文件名或附加请求该资产的版本字符串。这消除了发出任何请求的需要,除非资产已明确从缓存中的版本更改(不需要该 304 响应)。谷歌有more details on correct use of long-term caching。

【讨论】:

那么从速度的角度来看,有什么更好的选择......“200(缓存)”或“304”http状态消息? 200 缓存。这里有一些很好的说明:developer.yahoo.com/performance/rules.html#expires。您希望您的资产有尽可能长的到期时间,但必须在这与您以这种方式失去一定程度的控制权这一事实之间取得平衡。您可以做的一件事是为文件设置长期过期,然后在需要时为这些文件增加资产版本号。例如,您可以在 元素中包含 style.css?v1 并在有更改时增加 style.css?v2。 正义,那么为什么 Firebug 报告 ga.js 从本地缓存(状态 = 200 缓存)中提取,而 combine.min.js 报告 304 http 状态。奇怪的是,这两个文件都是相同的文件类型 (JavaScript) 并且驻留在同一个服务器目录中。您会认为两者都是 200 或 304,并且没有区别 如果age 小于max-age,则max-ageage 标头组合也会导致200 个(缓存)结果。一个例外是当用户单击浏览器刷新按钮时,会发送一个 304 标头。 HTML5 Boilerplate 建议不要使用缓存清除的查询字符串方法 -​​ 最好将每个文件的 hrefurl,src 引用更改为包含“指纹”(文件的哈希值或简单的递增数字),然后告诉服务器剥离该指纹并仅提供style.css 或其他任何内容。如果您不能在服务器上执行此操作,请让您的构建系统使用指纹重命名实际文件。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

我什至无法描述我花了多少时间试图弄清楚对 CDN 的请求的 304 状态。虽然你回答的问题有点不同,但你应该得到赏金:-) 您是对的:代码的差异与您是否正在重新加载页面有关。如果我重新加载页面,我会在浏览器的网络监视器中看到 304 代码。但是,如果我访问另一个使用这些相同文件的 URL,我会在浏览器的网络监视器中看到 200(来自缓存)代码。在我的情况下,另一个 URL 只是附加到原始 URL 的查询字符串(页面是基本相同)。【参考方案4】:

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

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

【讨论】:

这也是我的理解......这就是为什么我在原始帖子中声明我已经多次刷新我的页面并且仍然为同一个图标获得“200(缓存)”。 ico 和特定的 JavaScript 包括我有。很奇怪 200 实际上并不意味着缓存,它只是意味着 OK。可能是您的服务器配置没有明确告诉浏览器缓存您的 ico 和 js 文件,这将使其返回状态代码 200。 在我的某些 JavaScript 中,b/c 不是这种情况,我收到 304,而其他 JavaScript 我收到“200(缓存)”。所有 JavaScript 都位于同一个 Web 服务器目录 example.com/js/ 我应该补充一下,200(缓存)只是意味着它是在本地缓存的,实际上并不向服务器发出请求,这比去服务器并获得 304 响应要快。跨度> 我已经更新了我的原始帖子以显示我的实时网站和相关的 JavaScript。请参阅我更新的原始帖子。【参考方案5】:

最后一个问题,为什么?我会尽量用我知道的来解释

通俗地解释一下这三个状态码。

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 也可能使用多个服务器来提供您的内容,如果这些服务器具有不同的配置。然后这些状态可以改变。希望对您有所帮助。

【讨论】:

304 - Not Modified 不是服务器的“拒绝”。它是服务器向客户端声明“对于您要求的版本,我知道它没有被修改,您并不真的需要该文件”。从技术上讲,304 是“重定向”响应代码之一。它告诉客户端“从你自己的缓存中获取它”。

总结http状态码和200,304状态码

状态码 响应类别 中文意思1XX 信息性状态码(Informational)服务器正在处理请求2XX成功状态码(Success)请求已正常处理完毕3XX重定向状态码(Redirection)需要进行额外操作以完成请求 4XX客户端错误状态码(ClientError... 查看详情

http状态码304与etag详解(代码片段)

总结一下,最近项目开发遇到的。由于缓存框架设计时,缓存请求文件时只以发起请求的url为key,导致在客户端发起url相同,传参类型不同的请求时,交替请求会出现,带上一次请求返回的etag,进行下次请求ÿ... 查看详情

http状态码,200,304,404等

下面是常见的HTTP状态码:200-请求成功301-资源(网页等)被永久转移到其它URL404-请求的资源(网页等)不存在500-内部服务器错误 HTTP状态码分类分类分类描述1**信息,服务器收到请求,需要请求者继续执行操作2**成功,操作... 查看详情

http状态码304与etag详解(代码片段)

...,所以每次请求都是200,导致缓存没有效果。HTTP状态码304我们经常会看到请求地址中状态存在304,如果客户端(浏览器)发送的是一个条件验证请求,则web服务器可能会返回304响应,这就表明了客户端中所请求... 查看详情

http状态码304与etag详解(代码片段)

...,所以每次请求都是200,导致缓存没有效果。HTTP状态码304我们经常会看到请求地址中状态存在304,如果客户端(浏览器)发送的是一个条件验证请求,则web服务器可能会返回304响应,这就表明了客户端中所请求... 查看详情

http状态码

http状态码有哪些,这也是一个很高频的面试问题。一般大家都知道404页面不存在,500服务器错误,301重定向,302临时重定向,200ok,401未授权啥的。如果只是简单的这样答,可能只能让面试官给你的答案打个五六十分,不足以给... 查看详情

http状态码

一些常见的状态码如下:200 –服务器成功返回网页301–永久移动(该状态码表示请求的资源已被分配了新的URI)304 – 状态码或许不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应,意思就是本地... 查看详情

常见的http状态码详细解析

http状态码分为五类:  1XX  信息    服务器收到请求,需要请求者继续操作  2XX  成功    请求被成功接手并返回给请求者  3XX  重定向   需要进一步操作才能完成请求  4XX  客户端错误 请求... 查看详情

http:常见的状态码

...rverError服务器遇到一个错误,使其无法对请求提供服务。状态码状态消息含 查看详情

http状态码

如下所示:200OK服务器成功处理了请求(这个是我们见到最多的)301/302MovedPermanently(重定向)请求的URL已移走。Response中应该包含一个LocationURL,说明资源现在所处的位置304NotModified(未修改)客户的缓存资源是最新的,要客户端... 查看详情

http状态码

 200OK请求成功。 302Found请求重定向。 304NotModified(RFC7232)请求资源没有改变,访问本地缓存。 404NotFound请求资源不存在。通常是用户路径编写错误,也可能是服务器资源已删除。 500InternalServerError服务器内部错误... 查看详情

http协议常见状态码

200  OK-成功返回状态,对应GET,PUT,PATCH,DELETE201  created-成功创建304  notmodified-HTTP缓存有效400  badrequest-请求格式错误401  unauthorized -未授权403  forbidden -鉴权成功,但该用户没有权限404  notfound -请求的资... 查看详情

http之状态码

状态码:范围已定义范围分类100~199100~101信息性状态码200~299200~206成功状态码300~399300~307重定向状态码400~499400~417客户端错误状态码500~599500~505服务端错误状态码 常用状态码:200:请求没问题303:客户发起POST请求时,客户端再... 查看详情

遇过的http状态码

200OK成功301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。304 Not Modified有... 查看详情

http协议状态码详解

 状态码分类HTTP状态码被分为五大类,目前我们使用的HTTP协议版本是1.1,支持以下的状态码。随着协议的发展,HTTP规范中会定义更多的状态码。 小技巧: 假如你看到一个状态码518,你并不知道具体518是什么意思。这... 查看详情

304状态码前后的具体流程

首先304状态码或许不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应。    客户端在请求一个文件的时候,发现自己缓存的文件有LastModified,那么在请求中会包含IfModifiedSince,这个时间就是缓存... 查看详情

http常见状态码

200OK 请求成功。一般用于GET与POST请求301MovedPermanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替302 Found 临时移动。与... 查看详情

http状态码

我们在WEB开发中经常会遇到HTPP的状态码,如200、304、500等等。熟练掌握这些状态码,对我们WEB开发很有帮助。下面我简要介绍一下HTTP的状态码,以供交流探讨。HTTP状态码负责客户端HTTP请求的返回结果,标记服务器端处理是否... 查看详情