在Cache-Control HTTP标头中使用max-age和s-maxage是否有意义?

una*_*dan 27 caching http http-headers

考虑到max-age适用于所有缓存,而s-maxage仅适用于共享缓存(代理和网关缓存)....

在非可过期和公共页面中使用这两个指令是否有意义?

控制器伪代码:

w = Response();
w.setPublic();
w.setMaxAge("1 year");
w.setShareMaxAge("1 year");

return w;
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 27

来自HTTP标头字段定义:

14.9.3基本过期机制的修改

...

S-最大生存周期

如果响应包含s-maxage指令,则对于共享缓存(但不包括私有缓存),此指令指定的最大期限将覆盖 max-age指令或Expires标头指定的最大期限.

...

注意," 覆盖 ".因此,只有当您打算为共享缓存指定不同的最大年龄时才有意义max-age,最终用户将使用该最大年龄.

在您的特定示例中,它们是相同的,因此指定s-maxage是不必要的.

  • 我不同意这是不必要的.像反向代理缓存(即清漆)这样的共享缓存可能比私有浏览器缓存具有更长的缓存值,因为清除后面的Web应用程序会清除内容,但是在浏览器中,人们希望从服务器获得更新的版本.因此,如果想要为用户提供最新内容但希望从页面渲染后端加载,那么这很有意义. (11认同)
  • 对于服务器上的反向代理或其他缓存,实际上有一个比max-age更短的s-maxage是有意义的.私有缓存可以保留旧版本,但其他用户的请求会更新鲜.所以这一切都取决于内容所需的新鲜度. (3认同)

zai*_*eer 7

定义中要注意的关键点是共享缓存

来自HTTP标头字段定义

14.9.3基本过期机制的修改

...

S-最大生存周期

如果响应包含s-maxage指令,则对于共享缓存(但包括私有缓存),此指令指定的最大期限将覆盖 max-age指令或Expires标头指定的最大期限.

...

这意味着像varnish,cloudfront,cloudflare这样的反向代理/缓存可以具有与浏览器缓存不同的缓存时代.我个人更喜欢s-maxage高于的价值maxage

在HTTP 1.1中,一旦响应被缓存,您就无法联系浏览器以使缓存无效,但您可以将其告知CDN.

  • 实际上很容易通过向资产附加查询字符串来使浏览器缓存无效. (3认同)