首页 文章

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

提问于
浏览
183

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

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

200 200(缓存)304

通过谷歌的“页面速度” .

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

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

我不明白为什么不同 .

UPDATE

使用Google "Page Speed",我收到的"200 (cache)"为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(缓存)状态代码 .

6 回答

  • 2

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

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

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

  • 8

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

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

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

  • 18

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

  • 1

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

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

  • 209

    304未经修改 . 我在我的媒体文件如css和js中获得了很多代码 .

    http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5

  • 60

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

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

    • 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内容 . 然后这些状态可能会改变 . 希望能帮助到你 .

相关问题