代码之家  ›  专栏  ›  技术社区  ›  erikkallen

为什么火狐会往返于服务器以确定我的文件是否被修改?

  •  4
  • erikkallen  · 技术社区  · 15 年前

    我的网站上有一些静态内容,我为它们设置了缓存(使用ASP.NET MVC)。根据Firebug,我第一次打开页面时,Firefox发送这个请求:

    GET /CoreContent/Core.css?asm=0.7.3614.34951
    Host: 127.0.0.1:3916
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
    Accept: text/css,*/*;q=0.1
    Accept-Language: en-us,en;q=0.5
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://127.0.0.1:3916/Edit/1/101
    Cookie: .ASPXAUTH=52312E5A802C1A079E2BA29AA2BFBC5A38058977B84452D62ED52855D4164659B4307661EC73A307BFFB2ED3871C67CB3A9AAFDB3A75A99AC0A21C63A6AADE9A11A7138C672E75125D9FF3EFFBD9BF62
    Pragma: no-cache
    Cache-Control: no-cache
    

    我的服务器对此进行了答复:

    Server: ASP.NET Development Server/9.0.0.0
    Date: Mon, 23 Nov 2009 18:44:41 GMT
    X-AspNet-Version: 2.0.50727
    X-AspNetMvc-Version: 1.0
    Cache-Control: public, max-age=31535671
    Expires: Tue, 23 Nov 2010 18:39:12 GMT
    Last-Modified: Mon, 23 Nov 2009 18:39:12 GMT
    Vary: *
    Content-Type: text/css
    Content-Length: 15006
    Connection: Close
    

    到目前为止,一切都很好。但是,如果我刷新firefox(不是缓存清除刷新,只是普通刷新),在刷新周期内,firefox将再次使用此请求访问服务器:

    GET /CoreContent/Core.css?asm=0.7.3614.34951
    Host: 127.0.0.1:3916
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
    Accept: text/css,*/*;q=0.1
    Accept-Language: en-us,en;q=0.5
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://127.0.0.1:3916/Edit/1/101
    Cookie: .ASPXAUTH=52312E5A802C1A079E2BA29AA2BFBC5A38058977B84452D62ED52855D4164659B4307661EC73A307BFFB2ED3871C67CB3A9AAFDB3A75A99AC0A21C63A6AADE9A11A7138C672E75125D9FF3EFFBD9BF62
    If-Modified-Since: Mon, 23 Nov 2009 18:39:20 GMT
    Cache-Control: max-age=0
    

    我的服务器响应的 304 Not Modified .

    为什么火狐会发出第二个请求?在第一个响应中,我说缓存一年内不会过期(我打算在事情发生变化时使用查询参数)。我是否需要添加另一个响应头来防止这种额外的往返?

    编辑 :无论我是按刷新键,还是再次转到页面(或引用相同外部文件的其他URL),都无关紧要。火狐又做了同样的事。另外,我不认为这是FF中的错误,我只是想知道是否还有另一个标题可以设置,这意味着“这个文档永远不会更改,不要再打扰我了”。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Roman    15 年前

    对于所有现代浏览器来说,这种行为似乎都是“按设计”的。在IE中,你可以调查同样的情况。点击F5总是导致浏览器检查内容是否被修改。在清除缓存请求期间,浏览器不传递上次修改的头,服务器必须返回HTTP 200(而不是HTTP 304),所以304在您的情况下并没有那么糟糕。

        2
  •  0
  •   erikkallen    14 年前

    显然,这个问题是由于 Vary: * 正在将头添加到响应中。若要在ASP.NET中删除此项,请将其添加到 <system.web> 章节:

    <caching>
        <outputCache omitVaryStar="true"/>
    </caching>
    

    对我来说,这个开关似乎是“是的,我想要一个工作的行为,而不是一个不工作的行为”,但一旦你找到它,翻转它是微不足道的。