【问题标题】:Leverage browser caching for the static files利用浏览器缓存静态文件
【发布时间】:2018-05-28 03:19:08
【问题描述】:

我不确定,在 Golang 中我们如何仅将浏览器缓存用于静态文件,例如 CSSjs 而不是 HTML 模板文件。

在 Apache 中使用 .htaccess,它曾经很容易,但我在 golang 中没有看到任何这样的东西

我想知道,任何可以缓存静态文件的黑客或方法,例如cssjs

不使用 cloudflare - 我的应用无法使用 cloudflare。

【问题讨论】:

    标签: go browser-cache static-files


    【解决方案1】:

    浏览器缓存由服务器发送的标头控制。这样,它不依赖于特定安装的软件。

    您需要发送标头EtagCache-Control。像这样

    func Handler(w http.ResponseWriter, r *http.Request) {
        e := "SomeKey describing content - eg checksum"
        w.Header().Set("Etag", e)
        w.Header().Set("Cache-Control", "max-age=2592000") // 30 days
    
        if match := r.Header.Get("If-None-Match"); match != "" {
            if strings.Contains(match, e) {
                w.WriteHeader(http.StatusNotModified)
                return
            }
        }
        ...
    }
    

    有用的链接:

    【讨论】:

    • 它还缓存 HTML 页面。
    • 我会缓存你所说的内容:你可以为静态文件发送此类标题,而为动态内容发送另一个标题(如 Cache-Control: no-cache, no-store, max-age=0 而没有 Etag)以禁止缓存。
    • 我开发了这个包,用于根据文件内容添加 ETag 和 Cache-Control 标头。这部分已完全实现。 (github.com/dc0d/cache-control)
    • @user3767643 我完全不推荐使用kataras/iris。
    • 一个非常奇怪的产品,因为他的作者而永远不会聚集健康的社区。地鼠无法接受他的发展方式。我不想对任何人主观,所以建议更好地获得客观图像以咨询谷歌。关于作者和鸢尾花。因此,一旦获得不受支持的产品,您就有风险。
    【解决方案2】:

    您使用 golang 的事实并不意味着您不能使用像 ngnix 或 apache 这样的反向代理来处理浏览器缓存和其他您想要开箱即用的重要事情,而不必直接在您的 api 中处理它们

    【讨论】:

    • 虽然这完全没有必要,但它会添加一个外部依赖项,它有自己的安装、配置和资源要求。如果您只需要设置缓存标头,那么反向代理就太过分了。
    • 这是真实而明智的。相反,许多公司拥有已经使用反向代理的云基础架构 - 因此它们在许多情况下都是有效的选择。