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

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

200 200(缓存) 304

谷歌的“页面速度”。

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

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

我不明白有什么不同。

更新:

使用谷歌“页面速度”,我收到一个“200(缓存)”http://example.com/favicon.ico以及http://cdn.example.com/js/ga.js

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

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


当前回答

带有“200(缓存)”代码的项直接从浏览器缓存中完成,这意味着对这些项的原始请求返回的头部表明浏览器可以缓存它们(例如,未来过期或cache - control: max-age头),并且在您触发新请求时,这些缓存的对象仍然存储在本地缓存中,尚未过期。

另一方面,304是服务器在浏览器检查一个文件是否从它缓存的最后一个版本被修改后的响应(答案是“no”)。

为了获得最优的web性能,你最好为所有资产设置一个远未来的Expires:或Cache-Control: max-age头,然后当资产需要更改时,更改资产的实际文件名或附加版本字符串到该资产的请求。这消除了发出任何请求的需要,除非资产与缓存中的版本确实发生了更改(不需要304响应)。谷歌有关于正确使用长期缓存的更多细节。

其他回答

This threw me for a long time too. The first thing I'd verify is that you're not reloading the page by clicking the refresh button, that will always issue a conditional request for resources and will return 304s for many of the page elements. Instead go up to the url bar select the page and hit enter as if you had just typed in the same URL again, that will give you a better indicator of what's being cached properly. This article does a great job explaining the difference between conditional and unconditional requests and how the refresh button affects them: http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about-conditional-http-requests-and-the-refresh-button.aspx

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

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

200 - success(浏览器请求并从服务器获取文件)

如果在服务器中启用了缓存

200(从内存缓存)-文件在浏览器中找到,所以浏览器不会从服务器请求 浏览器请求一个文件,但是被服务器拒绝

对于一些文件,浏览器决定从服务器请求,而对于一些文件,它决定从存储(缓存)文件读取。为什么会这样?每个文件都有有效期,所以

如果一个文件没有过期,那么浏览器将使用从缓存(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(缓存)”代码的项直接从浏览器缓存中完成,这意味着对这些项的原始请求返回的头部表明浏览器可以缓存它们(例如,未来过期或cache - control: max-age头),并且在您触发新请求时,这些缓存的对象仍然存储在本地缓存中,尚未过期。

另一方面,304是服务器在浏览器检查一个文件是否从它缓存的最后一个版本被修改后的响应(答案是“no”)。

为了获得最优的web性能,你最好为所有资产设置一个远未来的Expires:或Cache-Control: max-age头,然后当资产需要更改时,更改资产的实际文件名或附加版本字符串到该资产的请求。这消除了发出任何请求的需要,除非资产与缓存中的版本确实发生了更改(不需要304响应)。谷歌有关于正确使用长期缓存的更多细节。

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

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

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

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

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