在HTTP头中使用max-age和s-maxage有意义吗?

39

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

在不过期且公开的页面中同时使用这两个指令是否有意义?

控制器伪代码:

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

return w;
2个回答

40

来自HTTP头字段定义:

14.9.3 基本过期机制的修改

...

s-maxage

如果响应中包含s-maxage指令,则对于共享缓存(但不适用于私有缓存),该指令指定的最大年龄覆盖max-age指令或Expires头中指定的最大年龄。

...

注意,“覆盖”。因此,只有当您打算为共享缓存规定不同的最大年龄时,这才有意义,而此时用户使用的是max-age。

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


15
我不认同它是不必要的观点。像反向代理缓存(如Varnish)这样的共享缓存可能具有比私人浏览器缓存更长的缓存时间,因为位于Varnish后面的Web应用程序会清除内容,但在浏览器中,用户希望更常获取来自服务器的最新版本。因此,如果想要为用户提供最新的内容但又希望减轻页面渲染后端的负载,那么这就有很多意义。 - jensens
5
对于反向代理或其他服务器缓存,s-maxage比max-age更短可能是有意义的。私有缓存可以保留旧版本,但来自其他用户的请求会更新鲜。因此,一切都取决于内容所需的新鲜度。 - Daniel
所以,假设有一个带有以下缓存信息的对象 {"cache-control": "s-maxage=120, public", "etag": "w/12830-1542793456000", "last-modified": "wed, 21 nov 2018 09:44:16 gmt"},那么浏览器缓存计算出的正确的 freshness_time 是什么?是 120s 还是 10%*(current-time - last-modified) - weefwefwqg3

12

需要注意的关键点在于共享缓存

来自HTTP头字段定义

14.9.3基本过期机制的修改

...

s-maxage

如果响应包含s-maxage指令,则对于共享缓存(但不适用于私有缓存),由该指令指定的最大年龄覆盖了由max-age指令或Expires头指定的最大年龄。

...

这意味着像varnish、cloudfront和cloudflare这样的反向代理/缓存可以具有不同于浏览器缓存的缓存年龄。 我个人更喜欢s-maxage的值比maxage更高。

在HTTP 1.1中,一旦响应被缓存,就无法与浏览器联系以使缓存失效,但可以告诉CDN。


8
在浏览器缓存中添加查询字符串来使资源失效其实非常容易。 - Simon East
假设有一个带有缓存信息的对象 {"age": "2604", "cache-control": "public, s-maxage=2700", "last-modified": "thu, 26 mar 2020 18:32:56 gmt"},那么浏览器缓存正确计算的新鲜时间是多少?是2700-2604=96秒还是10%*(当前时间 - 最后修改时间) - weefwefwqg3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接