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

HTTP状态代码200(缓存)与状态代码304之间有什么区别?,http,caching,httpwebrequest,http-status-codes,cache-control,Http,Caching,Httpwebrequest,Http Status Codes,Cache Control,我正在使用Firefox的谷歌“页面速度”插件访问我的网站 我的页面上的某些组件显示为HTTP状态: 二百 200(缓存) 304 谷歌的“页面速度” 我感到困惑的是200(缓存)和304之间的区别 我已多次刷新页面(但尚未清除缓存),并且我的favicon.ico和一些图像的状态似乎始终为status=200(缓存),而其他一些图像的状态为http status 304 我不明白为什么会有不同 更新: 使用谷歌的“页面速度”,我收到了“200(缓存)”以及 但是,我收到的http状态为“304

我正在使用Firefox的谷歌“页面速度”插件访问我的网站

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

二百 200(缓存) 304

谷歌的“页面速度”

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

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

我不明白为什么会有不同

更新

使用谷歌的“页面速度”,我收到了“200(缓存)”以及

但是,我收到的http状态为“304”

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

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

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

为了获得最佳的web性能,您最好为所有资产设置一个遥远的未来
Expires:
缓存控制:max age
头,然后在需要更改资产时,更改资产的实际文件名或在该资产的请求中附加一个版本字符串。这样就不需要发出任何请求,除非资产已经从缓存中的版本发生了明确的更改(不需要该响应)。谷歌有。

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

有关状态代码的更多信息,请查看。

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

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


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

这也让我困惑了很长时间。我要验证的第一件事是,您没有通过单击“刷新”按钮来重新加载页面,这将始终发出一个有条件的资源请求,并将为许多页面元素返回304s。相反,转到url栏,选择页面并按enter键,就像您刚刚再次键入相同的url一样,这将为您提供一个更好的指示器,指示正确缓存的内容。本文很好地解释了有条件和无条件请求之间的区别以及刷新按钮如何影响它们:
关于你的最后一个问题,为什么?我会尽力用我所知道的解释

用外行的术语简要解释这三种身份代码

  • 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内容,如果这些服务器具有不同的配置。然后这些状态可以改变。希望能有所帮助。

那么从速度的角度来看,有什么更好呢。。。“200(缓存)”或“304”http状态消息?200缓存。这里有一些关于这方面的好注释:。你希望你的资产有尽可能长的到期时间,但你必须平衡这一点,因为这样你就失去了一定的控制权。您可以做的一件事是对文件设置长期过期,然后在需要时为这些文件增加资产版本号。例如,您可以包括style.css?v1和