35

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

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

控制器伪代码:

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

return w;
4

2 回答 2

36

HTTP 标头字段定义

14.9.3 基本过期机制的修改

...

s-maxage

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

...

注意,“覆盖”。因此,仅当您打算为共享缓存指定不同的最大年龄时才有意义,与max-age最终用户将使用的 相比。

在您的特定示例中,它们是相同的,因此s-maxage无需指定。

于 2013-04-12T13:44:15.290 回答
10

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

来自HTTP 标头字段定义

14.9.3 基本过期机制的修改

...

s-maxage

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

...

这意味着 varnish、cloudfront、cloudflare 等反向代理/缓存的缓存期限可能与浏览器缓存不同。我个人更喜欢的价值s-maxage高于maxage

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

于 2016-11-22T23:24:20.920 回答