diff --git a/changelog/unreleased/web-assets-caching.md b/changelog/unreleased/web-assets-caching.md index e6fc2547f..7db566fc8 100644 --- a/changelog/unreleased/web-assets-caching.md +++ b/changelog/unreleased/web-assets-caching.md @@ -5,3 +5,4 @@ Tags: accounts, settings, web We now set http caching headers for static web assets, so that they don't get force-reloaded on each request. The max-age for the caching is configurable and defaults to 7 days. The last modified date of the assets is set to the service start date, so that a service restart results in cache invalidation. https://github.com/owncloud/ocis/pull/866 +https://github.com/owncloud/ocis/pull/934 diff --git a/ocis-phoenix/pkg/service/v0/service.go b/ocis-phoenix/pkg/service/v0/service.go index 4bb9942b2..eea57c84a 100644 --- a/ocis-phoenix/pkg/service/v0/service.go +++ b/ocis-phoenix/pkg/service/v0/service.go @@ -146,6 +146,7 @@ func (p Phoenix) Static(ttl int) http.HandlerFunc { // we don't have a last modification date of the static assets, so we use the service start date lastModified := time.Now().UTC().Format(http.TimeFormat) + expires := time.Now().Add(time.Second * time.Duration(ttl)).UTC().Format(http.TimeFormat) return func(w http.ResponseWriter, r *http.Request) { if rootWithSlash != "/" && r.URL.Path == p.config.HTTP.Root { @@ -168,9 +169,9 @@ func (p Phoenix) Static(ttl int) http.HandlerFunc { return } - w.Header().Set("Cache-Control", fmt.Sprintf("max-age=%s", strconv.Itoa(ttl))) + w.Header().Set("Cache-Control", fmt.Sprintf("max-age=%s, must-revalidate", strconv.Itoa(ttl))) + w.Header().Set("Expires", expires) w.Header().Set("Last-Modified", lastModified) - w.Header().Del("Expires") static.ServeHTTP(w, r) } diff --git a/ocis-pkg/middleware/static.go b/ocis-pkg/middleware/static.go index 57f2e6957..d601a3eb7 100644 --- a/ocis-pkg/middleware/static.go +++ b/ocis-pkg/middleware/static.go @@ -24,15 +24,16 @@ func Static(root string, fs http.FileSystem, ttl int) func(http.Handler) http.Ha // we don't have a last modification date of the static assets, so we use the service start date lastModified := time.Now().UTC().Format(http.TimeFormat) + expires := time.Now().Add(time.Second * time.Duration(ttl)).UTC().Format(http.TimeFormat) return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if strings.HasPrefix(r.URL.Path, path.Join(root, "api")) { next.ServeHTTP(w, r) } else { - w.Header().Set("Cache-Control", fmt.Sprintf("max-age=%s", strconv.Itoa(ttl))) + w.Header().Set("Cache-Control", fmt.Sprintf("max-age=%s, must-revalidate", strconv.Itoa(ttl))) + w.Header().Set("Expires", expires) w.Header().Set("Last-Modified", lastModified) - w.Header().Del("Expires") static.ServeHTTP(w, r) } })