Considering that max-age applies to all the caches, and s-maxage only applies to shared caches (proxy and gateway cache)....
Does it make sense to use both directives in a non-expirable and public page?
Controller pseudo-code:
w = Response();
w.setPublic();
w.setMaxAge("1 year");
w.setShareMaxAge("1 year");
return w;
From HTTP Header Field Definitions:
14.9.3 Modifications of the Basic Expiration Mechanism
...
s-maxage
If a response includes an s-maxage directive, then for a shared cache (but not for a private cache), the maximum age specified by this directive overrides the maximum age specified by either the max-age directive or the Expires header.
...
Note, "overrides". So, it would only make sense if you intend to specify a different maximum age for shared caches as compared to max-age
, which would be used by end users.
In your particular example, they're the same, so specifying s-maxage
is just unnecessary.
Key point to note in the definition is share cache
From HTTP Header Field Definitions
14.9.3 Modifications of the Basic Expiration Mechanism
...
s-maxage
If a response includes an s-maxage directive, then for a shared cache (but not for a private cache), the maximum age specified by this directive overrides the maximum age specified by either the max-age directive or the Expires header.
...
It means that reverse proxy/caches like varnish, cloudfront, cloudflare can have a cache age different to browser cache.
I would personally prefer value of s-maxage
to be higher than maxage
In HTTP 1.1 once response is cached, you can't contact browser to invalidate cache but you can tell it to CDNs.