HTTP缓存:为什么使用ETag而不是Cache-Control和/或Expires?

时间:2011-12-05 20:20:13

标签: jquery http caching cache-control

当我注意到jQuery的HTTP browser cachingMedia Temple ProCDN backed library不遵循http://code.jquery.com/jquery-1.7.1.min.js时,我一直在阅读caching best practices并在我自己的网站上玩它。谷歌。

相当多(我认为),有两种类型的浏览器端缓存:

  1. Expires和Cache-Control:max-age。

    这些被认为是无条件应用的“强大缓存标头”;也就是说,一旦设置并下载资源,浏览器就不会发出任何资源的GET请求,直到有效期或最长期限为止。达到了“

  2. Last-Modified和ETag

    这两者都提供了各种缓存,但Last-Modified遵循特定于浏览器的启发式方法,并且ETag需要更多的HTTP请求,尽管在返回304 Not-Modified时它们可以很轻。无论如何,这两者都可能涉及更多的GET请求。

  3. 静态jQuery版本永远不会更改。所以我认为应该有一个远期的Expires标题。更重要的是,这样一个可以在许多站点上使用的资产理想情况下不需要新的GET请求(即使它对于检查ETag的有效性而言很小)。

    似乎只使用了ETag而没有Cache-Control或Expires标头:

    Status: HTTP/1.1 200 OK
    Accept-Ranges:  bytes   
    Content-Type:   application/x-javascript; charset=utf-8 
    Date:   Mon, 05 Dec 2011 19:45:57 GMT   
    ETag:   "9e69008-16eac-5177b900"    
    Last-Modified:  Tue, 22 Nov 2011 02:11:16 GMT   
    Server: ECS (fra/D59E)  
    Vary:   Accept-Encoding 
    X-Cache:    HIT 
    Content-Length: 93868   
    Connection: close
    

    来自:http://web-sniffer.net/?url=http%3A%2F%2Fcode.jquery.com%2Fjquery-1.7.1.min.js

    那么有没有理由不设置远期的Expires标头或使用Cache-Control来实现这样的情况?我在这里误读了什么吗?或者这是jQuery人员的错误配置?

1 个答案:

答案 0 :(得分:2)

是的,我会谈到这个问题,但请注意,这可能不是发表此类问题的最佳场所,因为这不是一个真正的问题吗? (也许?但是whatevs)

实际上,我们现在还没有使用proCDN - 我们使用的是那个不让我们自定义的旧版本:/但是!好消息!他们用一些新东西把它们挂起来,procdn(它有一些统计/跟踪的东西也会有点整洁)和一些更快的盒子所以我们应该能够让我们的缓存更好 - 因为你是对的,它是现在不是很好。此外,我们不能做任何自定义标题或类型或任何东西,这有时很好。

听起来你已经对此进行了大量的研究 - 如果你想提供你的帮助来解决其中一些设置的问题,那么有时会弹出#jquery-dev(对我来说是相同的用户名),因为你似乎知识渊博,有兴趣提供帮助:)