适用于不同类型资源的理想HTTP缓存控制标头

时间:2010-06-04 01:23:18

标签: http caching https http-headers

我想找到一组最小的标题,可以使用“所有”缓存和浏览器(当使用 HTTPS 时也是如此!)

在我的网站上,我将有三种资源:

(1)永远可缓存(所有用户的公共/相等)

示例:0A470E87CC58EE133616F402B5DDFE1C.cache.html(auto generated by GWT

  • 这些文件在更改内容时会自动分配新名称(基于MD5)。

  • 即使使用HTTPS,它们也应该尽可能地缓存(所以我假设,我应该设置Cache-Control: public,特别是对于Firefox?)

  • 如果内容发生变化,他们不应要求客户端往服务器进行往返验证。

(2)偶尔更改(所有用户公开/平等)

示例:index.html,mymodule.nocache.js

  • 当部署新版本的网站时,这些文件会更改其内容而不会更改网址。

  • 它们可以缓存,但每次都可能需要往返重新验证。

(3)每个请求的个人(私人/用户特定)

示例:JSON响应

  • 在任何情况下都不应将这些资源未加密缓存到磁盘。 (除非我有一些可以缓存的特定请求。)

我对我可能会为每种类型使用哪些标题有一个大致的想法,但总会有一些我可能遗漏的东西。

2 个答案:

答案 0 :(得分:88)

我可能会使用这些设置:

  1. Cache-Control: max-age=31556926 - 任何缓存都可以缓存表示。缓存的表示将被视为新鲜1年:
      

    要将响应标记为“永不过期”,原始服务器会发送一个   过期日期约为响应时间的一年   发送。 HTTP / 1.1服务器不应发送多个 Expires 日期   未来一年。

  2. Cache-Control: no-cache - 允许任何缓存缓存表示。但是,缓存必须在发布缓存副本之前将请求提交给源服务器进行验证。
  3. Cache-Control: no-store - 缓存不得在任何条件下缓存表示。
  4. 有关详细信息,请参阅Mark Nottingham’s Caching Tutorial

答案 1 :(得分:-2)

案例一和二实际上是相同的情况。 您应该设置Cache-Control: public,然后生成一个包含站点的内部版本号/版本的URL,以便您拥有可能永久持续的不可变资源。 您还希望将来设置Expires标题一年或更长时间,以便客户端不需要发出新鲜度检查。

对于案例3,您可以获得以下所有灵活性:

"Cache-Control", "no-cache, must-revalidate"
"Expires", 0
"Pragma", "no-cache"